PDA

View Full Version : سوال: سوال در مورد دسترسی به حافظه در Thread ها



Black Eyes
پنج شنبه 29 تیر 1391, 10:58 صبح
میدونیم که برای فراخوانی یک تابع داخل یک ترد از ترد دیگه باید همزمان سازی بشه و از Synchronize استفاده بشه.
دسترسی به Property های یک شیء هم چون read و write دارن پس میتونه باعث فراخوانی یک تابع بشه و فکر کنم واسه همینه که گفته میشه برای کار با UI (که معمولا شامل کامپوننتهایی میشه که با تغییر هر property یک متد paint فراخوانی می کنند) باید از Synchronize تابع داخل ترد اصلی استفاده بشه.

حالا سوالی که دارم اینه که اگه توی یه کلاس مشتق شده از Thread یک متغیر public داشته باشیم مثلا از نوع Int64 و بخوایم از یک ترد دیگه این مقدار رو تغییر بدیم مشکلی پیش میاد یا نه؟ خودم که فکر نمیکنم مشکلی پیش بیاد ولی میخواستم مطمئن بشم.
لطفا جوابتون رو با دلیل بیارید.

با تشکر

Felony
پنج شنبه 29 تیر 1391, 11:22 صبح
مثلا چه مشکلی ؟ خوب ماهیت یک فیلد Public این هست که از همه جا بهش دسترسی داشته باشید پس مشکلی پیش نمیاد ولی اگر قراره از چند ترد مختلف بهش دسترسی داشته باشید و مقداردهیش کنید اون وقت مشکل همزمانی دسترسی پیش میاد ، مثلا ترد اول یک مقدار رو داخل متغییر مینویسه و چند لحظه بعد ترد دوم کارش تموم میشه و مقدار دیگه ای رو داخل اون متغییر درج میکنه ؛ حالا ترد اول به متغییر نیاز پیدا میکنه و میخواد متغییر رو بخونه ، ولی حالا مقدار متغییر چیزی که انتظارش رو داره نیست چون ترد دوم Overwrite ش کرده که این مورد بحثش جدا هست و راهکارهای خاص خودش رو داره .

Black Eyes
پنج شنبه 29 تیر 1391, 11:28 صبح
نه فرض کنیم ترد اصلی که متغیر رو داره فقط ازش می خونه و بقیه ترد ها مینویسن و آخرین مقدار درج شده فقط واسه ی ما مهمه. اون موقع از لحاظ Deadlock توی ترد که مشکلی پیش نمیاد؟

Felony
پنج شنبه 29 تیر 1391, 17:16 عصر
خیر ؛ ترد های شما منبعی رو برای خودشون قفل نکردن که ترد بعدی نتونه بهش دسترسی داشته باشه و Deadlock به وجود بیاد ؛ Deadlock زمانی پیش میاد که تردی یک منبع رو برای استفاده خودش قفل کنه و شروع به انجام کاری بکنه و ترد دیگه ای بیاد و درخواست دسترسی به ان منبع رو به سیستم عامل اعلام کنه ؛ حالا سیستم عامل منتظر میمونه تا ترد اول کارش تموم بشه و منبعی که قفل کرده رو آزاد کنه تا اون رو به ترد دوم که درخواست داده بده و برای اون قفلش کنه ولی ترد اول به هر دلیلی منبع رو آزاد نمیکنه و ترد دوم بی تکلیف میمونه ...