میلاد نعمت پور
میلاد نعمت پور
خواندن ۲ دقیقه·۴ سال پیش

کلمه کلیدی volatile در C#

کلمه کلیدی volatile نشان می دهد که یک فیلد ممکن است توسط چندین thread همزمان اجرا می شوند تغییر کند. هدف اصلی از کلمه کلیدی Volatile جلوگیری از بهینه سازی کامپایلر به شرطی که تنها دسترسی یک Thread  را فرض می کند.

استفاده از volatile  این اطمینان را می دهد مقدار یک فیلد، جدیدترین مقداری است که در دسترس است و این مقدار منوط به caching نیست که مقادیر غیر فرار(non-volatile) هستند.


روش خوبی است که هر متغیری را که توسط چندین thread  استفاده شود به عنوان متغیر ناپایدار علامت گذاری کنید تا از رفتارهای غیر منتظره به دلیل بهینه سازی های پشت صحنه جلوگیری کند.

public class Example { public int x; public void DoStuff() { X=5; var y=x+10; Debug.WriteLine(“x=” x+” , y= “+y); } }

در تکه کد بالا کامپایلر x=5 , y=x+10 را می خواند و تعیین میکند که این مقدار y  همیشه 15  می ماند. بنابراین در آخرین بهینه سازی کامپایلر y=15 می باشد. اگر چه متغیر x  در حقیقت از نوع عمومی می باشد و مقدار x  ممکن است توسط Threadهای دیگر در زمان اجرا تغییر کند.دیگر مقدار y=15 نمی باشد. حال متغیر  x را از نوع volatile  تعریف می کنیم:

Public class Example { Public volatile int x; Public void DoStuff() { x=5; var y=x+10; Debug.writeline(“x=” x+” , y= “+y); } }

حال کامپایلر عملیات قفل را برای فیلد x  ایجاد می کند و این اطمنیان را می دهد که مقدار کنونی x  همیشه این مقدار را برگرداند. اگر چندین Thread بر روی این فیلد بخوانند و بنویسند این اطمینان را می دهد که این مقدار کنونی همیشه برمیگرداند. volatile میتواند فقط بر روی فیلدهای کلاس و ساختار عمال شود و برای مثال زیر معتبر نمی باشد

Public void MyMethod(){ volatile int x; }

فقط می توان بر روی فیلد های زیر اعمال کرد:

1- رفرنس تایپ و نوع های عمومی که رفرنس تایپ معرفی شده باشد

3. نوع های شمارشی که بر اساس sbyte, byte,short,int,ushort ,uint char, float, bool

3. نوع های شمارشی که بر اساس sbyte, byte, short, int, ushort, uint


نکات:

  • معمولا برای یک فیلد که چندین Thread  امکان دسترسی دارند و بدون عملیات قفل گذاری می باشند استفاده می شود.
  • کلمه کلیدی volatile می تواند بر روی فیلدهای از نوع های رفرنس اعمال می شود
  • نوع های دیگر از جمله double  , long نمیتوانند از ویژگی های volatile استفاده کنند زیرا خواندن و نوشتن در فیلد این نوع ها نمی توانند گارانتی کنند که اتمیک باشند. برای محافظت این نوع ها از دسترسی چند Thread از روش lock در کلاس interlocked  استفاده کنید.
برنامه نویسیc programming
شاید از این پست‌ها خوشتان بیاید