Post date: Nov 27, 2013 2:33:23 AM
سلام
از وقتی تازه با ++C آشنا شده بودم، میخواستم کاربرد کلمۀ کلیدی volatile را بدانم. اما همه جا فقط توضیحات بود یا مثالهایی که برای من کاملا نامفهوم بودند. در این پست مثالی نسبتا ساده از کاربرد این کلمه میبینید. یکی از کاربردهای این کلمه مواقعی است که دو thread مختلف از یک متغیر استفاده میکنند. نتیجه این مثال در Visual C++ 2010 Express مشهود است اما در کامپایلرهای دیگه شاید نباشد. این برنامه را در ویرایشگر کامپایلر قرار بدهید:
#include <conio.h>
#include <iostream>
using namespace std;
#include <Windows.h>
volatile bool b = true;
unsigned long _stdcall ThreadFunc(void* lpParam)
{ cout<< "Thread began\n";
while(b)
;
cout<< "Thread Ended";
return 0;
}int main()
{ unsigned long thread_id, thread_arg = 0;
CreateThread
(
0, // default security attributes
0, // use default stack size
ThreadFunc, // thread function
&thread_arg, // argument to thread function
0, // use default creation flags
&thread_id
);
Sleep(1000);
b = false;
_getch();
}از قسمت بالای VC++ 2010 Express، برنامه رو از حالت Debug به حالت Release در بیاروید. در این حالت برنامه موقع کامپایل برای بیش ترین سرعت بهینه میشود (اگر این طور نباشد باید خود شما از قسمت Optimizations در تنظیمات، بهینه سازی برای بیش ترین سرعت را انتخاب کنید). برنامه را اجرا کنید. اول "Thread began\n" و بعد از یک ثانیه "Thread Ended" چاپ میشود. حالا کلمه volatile را حذف کنید و برنامه او اجرا کنید. میبینید که هیچ وقت "Thread Ended" چاپ نمیشود. علت را میشود این طور توجیه کرد که موقع بهینه سازی، با توجه به مقدار اولیه b، این کد:
while(b) ;
با این عوض میشود:
while(true) ;
این کار اگر فقط یک thread موجود باشه اشکالی پیش نمیآورد اما چون برنامه بالا دو thread دارد، مشکلی به وجود آمده است.
اما کلمه کلیدی volatile (که به معنی ناپایدار هست) به کامپایلر میگوید که b مقدار ناپایداری دارد و مقدار هر لحظه ممکن است تغییر کند. برای همین کامپایلر موقع بهینه سازی مواظب ناپایداری b هست.
کلمه کلیدی volatile وقتی مورد استفاده قرار میگیرد که مقدار متغیر ممکن است در هر لحظه به وسیله سیستم عامل یا یک thread جدا یا به وسیله سخت افزاری تغییر کنه و به کار گیری این کلمه در بهینه سازی تأثیر دارد. در واقع بهینه سازی در مواردی مثل برنامه بالا (وقتی volatile حذف بشود) ممکن است نتیجه برنامه رو تغییر بده در حالی که نباید چنین اتفاقی بیفتد.