PDA

مشاهده نسخه کامل : متغیر یا تابع از نوع volatile



life24
15-04-13, 17:51
با سلام

میشه یک توضیحی بفرمائید. ما هر چه سعی کردیم نشد. متغیر یا تابع از نوع volatile چه فرقی با معمولی داره؟

ravegoat
15-04-13, 21:30
با سلام!

کلمه ی کلیدی volatile معنای متفاوتی در زبان های برنامه نویسی مختلف داره که برای درک این تفاوت ها می تونید به این لینک (Only the registered members can see the link) مراجعه کنید. ولی به کار گیری این کلمه ی کلیدی به هنگام تعریف یک متغیر در سی شارپ به این معناست که مقدار این متغیر می تونه توسط Thread های مختلف تغییر کنه.
وقتی ما از volatile در یه متغیر استفاده نکنیم و مقدار این متغیر توسط یه پردازش خارجی (مثل یه ریسمان مجزا) تغییر کنه کامپایلر متوجه اون نمیشه. چون به دلیل عمل Optimizing مقدار متغیر چک نمیشه. ولی وقتی از volatile استفاده کنیم عمل Optimizing روی متغیر صورت نمی گیره و مقدا راون مستقیما" از توی حافظه ی اصلی خونده میشه.

برای اطلاعات بیش تر:
Only the registered members can see the link
Only the registered members can see the link
Only the registered members can see the link

موفق باشید
آرمین

life24
16-04-13, 17:27
سلام
امکان داره عمل Optimizing را توضیح دهید؟ چرا ؟

ravegoat
16-04-13, 21:18
تو این لینک (Only the registered members can see the link) قشنگ توضیح داده شده بود ولی دوباره از همون جا این مطلب رو نقل می کنم:

برنامه ی زیر رو در نظر بگیرید:


static int foo;

void bar (void)
{
foo = 0;
while (foo != 255)
{
//...
}
}


حلقه ی while تا زمانی ادامه پیدا می کنه که مقدار foo برابر 255 بشه. از طرفی در خط قبل ما مقدار foo رو 0 کردیم و در این برنامه این مقدار هیچ وقت از صفر به مقدار دیگه ای تغییر داده نشده. درنتیجه مقدار foo هیچ وقت برابر 255 نمیشه و پیرو اون حلقه ی while هیچ زمان خاتمه پیدا نمی کنه. پس اصلا" نیازی نیست که همیشه مقدار foo بررسی بشه و حلقه بعدش تکرار بشه.

وقتی از کلمه ی volatile در تعریف متغیر foo استفاده نکنیم، کامپایلر برنامه ی ما رو به این شکل Optimize می کنه:


static int foo;

void bar (void)
{
foo = 0;
while (true)
{
//...
}
}


می بینیم چون نیازی به چک کردن foo نبود و حلقه ی while بی پایان است، کامپایلر foo رو در شرط حلقه با مقدار true جایگزین کرده که این عمل از فرآیند های Optimize محسوب میشه.

حالا فرض کنیم که مقدار foo نه توسط این برنامه بلکه توسط یه برنامه یا ریسمان دیگه تغییر داده بشه. اگه اون برنامه یا ریسمان مقدار foo رو برابر 255 کنه، حلقه باید طبق منطق کد اول تموم بشه ولی در کد Optimize شده چون مقدار foo بررسی نمیشه، حلقه همچنان تکرار میشه. برای اینکه در مرحله ی Optimize چنین مشکلات رخ نده، متغیر هایی رو که امکان تغییرشون توسط جریان های دیگه هست رو همراه با volatile تعریف می کنن که در اون صورت برنامه همواره مقدار متغیر رو از حافظه ی اصلی فرخوانی می کنه و اون متغیر ها مشمول Optimize نشن.

delaran
08-10-16, 18:25
تو این لینک (Only the registered members can see the link) قشنگ توضیح داده شده بود ولی دوباره از همون جا این مطلب رو نقل می کنم:

برنامه ی زیر رو در نظر بگیرید:


static int foo;

void bar (void)
{
foo = 0;
while (foo != 255)
{
//...
}
}


حلقه ی while تا زمانی ادامه پیدا می کنه که مقدار foo برابر 255 بشه. از طرفی در خط قبل ما مقدار foo رو 0 کردیم و در این برنامه این مقدار هیچ وقت از صفر به مقدار دیگه ای تغییر داده نشده. درنتیجه مقدار foo هیچ وقت برابر 255 نمیشه و پیرو اون حلقه ی while هیچ زمان خاتمه پیدا نمی کنه. پس اصلا" نیازی نیست که همیشه مقدار foo بررسی بشه و حلقه بعدش تکرار بشه.

وقتی از کلمه ی volatile در تعریف متغیر foo استفاده نکنیم، کامپایلر برنامه ی ما رو به این شکل Optimize می کنه:


static int foo;

void bar (void)
{
foo = 0;
while (true)
{
//...
}
}


می بینیم چون نیازی به چک کردن foo نبود و حلقه ی while بی پایان است، کامپایلر foo رو در شرط حلقه با مقدار true جایگزین کرده که این عمل از فرآیند های Optimize محسوب میشه.

حالا فرض کنیم که مقدار foo نه توسط این برنامه بلکه توسط یه برنامه یا ریسمان دیگه تغییر داده بشه. اگه اون برنامه یا ریسمان مقدار foo رو برابر 255 کنه، حلقه باید طبق منطق کد اول تموم بشه ولی در کد Optimize شده چون مقدار foo بررسی نمیشه، حلقه همچنان تکرار میشه. برای اینکه در مرحله ی Optimize چنین مشکلات رخ نده، متغیر هایی رو که امکان تغییرشون توسط جریان های دیگه هست رو همراه با volatile تعریف می کنن که در اون صورت برنامه همواره مقدار متغیر رو از حافظه ی اصلی فرخوانی می کنه و اون متغیر ها مشمول Optimize نشن.




میدونم خیلی زمان میگذره ولی دمت گرم با جواب دادنت
من که اینقدر توی سایت های ایرانی میگردم ولی درست و حسابی جواب نمیدن و مجبورم انگلیسی ها رو دنبال کنم و کلی وقتم میرفت تا بفهمم.اما 0.01 اون زمان رو صرف تشکر از شمایی میکنم که نمیدونم دوباره این مطلب به چشمتون میخوره یا نه