تو این لینک قشنگ توضیح داده شده بود ولی دوباره از همون جا این مطلب رو نقل می کنم:
برنامه ی زیر رو در نظر بگیرید:
حلقه ی while تا زمانی ادامه پیدا می کنه که مقدار foo برابر 255 بشه. از طرفی در خط قبل ما مقدار foo رو 0 کردیم و در این برنامه این مقدار هیچ وقت از صفر به مقدار دیگه ای تغییر داده نشده. درنتیجه مقدار foo هیچ وقت برابر 255 نمیشه و پیرو اون حلقه ی while هیچ زمان خاتمه پیدا نمی کنه. پس اصلا" نیازی نیست که همیشه مقدار foo بررسی بشه و حلقه بعدش تکرار بشه.کد:static int foo; void bar (void) { foo = 0; while (foo != 255) { //... } }
وقتی از کلمه ی volatile در تعریف متغیر foo استفاده نکنیم، کامپایلر برنامه ی ما رو به این شکل Optimize می کنه:
می بینیم چون نیازی به چک کردن foo نبود و حلقه ی while بی پایان است، کامپایلر foo رو در شرط حلقه با مقدار true جایگزین کرده که این عمل از فرآیند های Optimize محسوب میشه.کد:static int foo; void bar (void) { foo = 0; while (true) { //... } }
حالا فرض کنیم که مقدار foo نه توسط این برنامه بلکه توسط یه برنامه یا ریسمان دیگه تغییر داده بشه. اگه اون برنامه یا ریسمان مقدار foo رو برابر 255 کنه، حلقه باید طبق منطق کد اول تموم بشه ولی در کد Optimize شده چون مقدار foo بررسی نمیشه، حلقه همچنان تکرار میشه. برای اینکه در مرحله ی Optimize چنین مشکلات رخ نده، متغیر هایی رو که امکان تغییرشون توسط جریان های دیگه هست رو همراه با volatile تعریف می کنن که در اون صورت برنامه همواره مقدار متغیر رو از حافظه ی اصلی فرخوانی می کنه و اون متغیر ها مشمول Optimize نشن.






پاسخ با نقل قول
Bookmarks