volatile
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
حذف بشود) ممکن است نتیجه برنامه رو تغییر بده در حالی که نباید چنین اتفاقی بیفتد.