با سلام
میشه یک توضیحی بفرمائید. ما هر چه سعی کردیم نشد. متغیر یا تابع از نوع volatile چه فرقی با معمولی داره؟
با سلام
میشه یک توضیحی بفرمائید. ما هر چه سعی کردیم نشد. متغیر یا تابع از نوع volatile چه فرقی با معمولی داره؟
|
با سلام!
کلمه ی کلیدی volatile معنای متفاوتی در زبان های برنامه نویسی مختلف داره که برای درک این تفاوت ها می تونید به این لینک مراجعه کنید. ولی به کار گیری این کلمه ی کلیدی به هنگام تعریف یک متغیر در سی شارپ به این معناست که مقدار این متغیر می تونه توسط Thread های مختلف تغییر کنه.
وقتی ما از volatile در یه متغیر استفاده نکنیم و مقدار این متغیر توسط یه پردازش خارجی (مثل یه ریسمان مجزا) تغییر کنه کامپایلر متوجه اون نمیشه. چون به دلیل عمل Optimizing مقدار متغیر چک نمیشه. ولی وقتی از volatile استفاده کنیم عمل Optimizing روی متغیر صورت نمی گیره و مقدا راون مستقیما" از توی حافظه ی اصلی خونده میشه.
برای اطلاعات بیش تر:
http://www.eca.ir/forum2/index.php?topic=35819.0
http://aliaghdam.com/blog/volatile-keyword-in-csharp
http://barnamenevis.org/archive/index.php/t-340631.html
موفق باشید
آرمین
'چو ایران نباشد، تن من مباد
Dim Armin As Iranian
If Iran.Enabled = False Then Armin.Enabled = False
سلام
امکان داره عمل Optimizing را توضیح دهید؟ چرا ؟
تو این لینک قشنگ توضیح داده شده بود ولی دوباره از همون جا این مطلب رو نقل می کنم:
برنامه ی زیر رو در نظر بگیرید:
حلقه ی 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 نشن.
'چو ایران نباشد، تن من مباد
Dim Armin As Iranian
If Iran.Enabled = False Then Armin.Enabled = False
برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید ارسالی توسط ravegoat برای مشاهده این لینک/عکس می بایست عضو شوید ! برای عضویت اینجا کلیک کنید
میدونم خیلی زمان میگذره ولی دمت گرم با جواب دادنت
من که اینقدر توی سایت های ایرانی میگردم ولی درست و حسابی جواب نمیدن و مجبورم انگلیسی ها رو دنبال کنم و کلی وقتم میرفت تا بفهمم.اما 0.01 اون زمان رو صرف تشکر از شمایی میکنم که نمیدونم دوباره این مطلب به چشمتون میخوره یا نه
1 کاربر در حال مشاهده این موضوع. (0 عضو و 1 میهمان)
Bookmarks