PDA

View Full Version : Thread و همگام سازی



smt1383
چهارشنبه 25 فروردین 1389, 09:11 صبح
با سلام خدمت دوستان
متأسفانه من هنوز مفهوم Synchronization را خوب متوجه نشده ام.من در فرم اصلی برنامه ام یک تایمر دارم که هر 100 میلی ثانیه یک مقدار را روی یک label روی فرم نمایش می دهد. از طرفی در thread دوم نیز اطلاعاتی را از بانک اطلاعاتی می خوانم و روی همان label نمایش می دهم. با توجه به اینکه هر دو thread به یک label مقدارهایی اختصاص می دهند در اینجا نیاز به Synchronization داریم درسته؟

babak.h
یک شنبه 29 فروردین 1389, 16:31 عصر
بله درسته به این حالت میگن Race Condition یعنی دو Thread می خواهند همزمان به یک شیء که در حافظه مشترک قرار دارد دسترسی پیدا کنند
توجه کنید که در دات نت هر thread حافظه stack خودش را دارد ولی حافظه Heap بین آنها مشترک است.
حالا برای حل این مشکل روش های مختلفی وجود دارد
ساده ترین (و معمولا بهترین) روش در دات نت استفاده از Monitor یا lock است (هر دوتاش در واقع یک کار انجام میده)
یعنی یک آبجکت (هرچیزی که باشه مثلا bool) تعریف میکنید بعنوان قفل و هر دو Thread قبل از اینکه بخوان به اون شی مشترک (در مثال شما label) دسترسی پیدا کند قبلش باید سعی کند اون قفل را قفل کند اگر نتونست یعنی Thread دیگری قبلا اون رو قفل کرده و در حال استفاده است پس باید منتظر بمونه تا کار اون Thread تموم بشه بعد قفل رو قفل کنه و کارش رو شروع کنه

همه ی این کار ها در دات نت به راحتی با دستور lock انجام میشه.

من اینجا مفهوم هم زمانی رو سعی کردم توضیح بدم

سایر روش ها استفاده از Mutex ٬ Semaphore و...

saed2006
یک شنبه 29 فروردین 1389, 17:44 عصر
بله درسته به این حالت میگن Race Condition یعنی دو Thread می خواهند همزمان به یک شیء که در حافظه مشترک قرار دارد دسترسی پیدا کنند
توجه کنید که در دات نت هر thread حافظه stack خودش را دارد ولی حافظه Heap بین آنها مشترک است.
حالا برای حل این مشکل روش های مختلفی وجود دارد
ساده ترین (و معمولا بهترین) روش در دات نت استفاده از Monitor یا lock است (هر دوتاش در واقع یک کار انجام میده)
یعنی یک آبجکت (هرچیزی که باشه مثلا bool) تعریف میکنید بعنوان قفل و هر دو Thread قبل از اینکه بخوان به اون شی مشترک (در مثال شما label) دسترسی پیدا کند قبلش باید سعی کند اون قفل را قفل کند اگر نتونست یعنی Thread دیگری قبلا اون رو قفل کرده و در حال استفاده است پس باید منتظر بمونه تا کار اون Thread تموم بشه بعد قفل رو قفل کنه و کارش رو شروع کنه

همه ی این کار ها در دات نت به راحتی با دستور lock انجام میشه.

من اینجا مفهوم هم زمانی رو سعی کردم توضیح بدم

سایر روش ها استفاده از Mutex ٬ Semaphore و...

.net برای پیاده سازی انچه در درس سیستم عامل خوندیم چه کلاس هایی رو داره و نحوه پیاده سازیش رو با یه مثال بیان میکنید
تشکر

mehdi.mousavi
یک شنبه 29 فروردین 1389, 17:51 عصر
.net برای پیاده سازی انچه در درس سیستم عامل خوندیم چه کلاس هایی رو داره و نحوه پیاده سازیش رو با یه مثال بیان میکنید
تشکر

سلام.
برای مشاهده Synchronization Object ها در .NET میتونید به این سایت (http://msdn.microsoft.com/en-us/library/ms686364%28v=VS.85%29.aspx) رجوع کنید. خوندن این مقاله (http://msdn.microsoft.com/en-us/magazine/cc188793.aspx) رو نیز، به افرادیکه دوست دارن در این زمینه اطلاعاتشون رو بیشتر کنن، توصیه می کنم.

موفق باشید.

saed2006
یک شنبه 29 فروردین 1389, 17:54 عصر
سلام.
برای مشاهده Synchronization Object ها در .NET میتونید به این سایت (http://msdn.microsoft.com/en-us/library/ms686364%28v=VS.85%29.aspx) رجوع کنید. خوندن این مقاله (http://msdn.microsoft.com/en-us/magazine/cc188793.aspx) رو نیز، به افرادیکه دوست دارن در این زمینه اطلاعاتشون رو بیشتر کنن، توصیه می کنم.

موفق باشید.

کسی که بخواد یه برنامه multi theard بنویسه باید به این مفاهیم مسلط باشه؟

mehdi.mousavi
یک شنبه 29 فروردین 1389, 18:16 عصر
کسی که بخواد یه برنامه multi theard بنویسه باید به این مفاهیم مسلط باشه؟

ببینید، بستگی داره. اگر برنامه رو روی Framework خوب و مناسبی بنا کنید، حداکثر سه چهار نقطه (یا کمتر) در برنامه وجود خواهد داشت که نیاز به استفاده از (برخی از) این ابزارها دارید. هر کدوم از اونها، کاربرد خاصی دارن و بسته به کاری که شما میخواهید انجام بدید، باید از مناسبترینشون استفاده کنید.

من کدهای زیادی می بینم که مدام توش از lock استفاده شده. این یعنی اینکه چهارچوب درستی برای برنامه طراحی نشده که هر کسی، میتونی از هر Thread ای، به Thread دیگه دسترسی پیدا کنه.

اگر این دسترسی ها رو ضابطه مند کنید (با طراحی خوب برنامه)، دیگه حداکثر چند جای محدود در برنامه (و قاعدتا یکی دو کلاس، و نه بیشتر) نیاز دارید تا از این دستورات استفاده کنید. در صورتیکه اگر کد مورد نظر بی ضابطه نوشته بشه، دردسرهایی که ممکنه تولید کنه بیشتر از مسائلی هستش که میتونه حل کنه.

اما در پاسخ به سوال فوق، بله. باید با همه این Synchronization Object ها در حد مطلوب آشنا باشید و بدونید کدوم، کی استفاده میشه.

موفق باشید.

smt1383
سه شنبه 31 فروردین 1389, 20:24 عصر
با تشکر از راهنمایی دوستان. حال اگر دو یا چند Thread به صورت همزمان یک منبع مشترک را بخوانند (مثلاً یک متغیر مشترک) ولی آنرا تغییر ندهند آیا باز هم نیاز به Synchronization است؟

smt1383
چهارشنبه 01 اردیبهشت 1389, 21:52 عصر
کسی از دوستان نمیتونه راهنمایی کنه؟ اینکه اگر دو Thread با هم مقدار یک منبع مشترک را فقط بخوانند آیا باز هم نیاز به Synchronization هست؟ یا اینکه اگر مثلاً یک List داشته باشیم که یک Thread همواره آیتم هایی به انتهای لیست اضافه می کنه و Thread دوم نیز از ابتدای لیست یک آیتم را خوانده و پس از پردازش آن آیتم را از اول لیست حذف می کند. آیا اینجا هم نیاز به Synchronization هست؟ با توجه به اینکه هر دو Thread به یک List مشترک دسترسی دارند اما هر کدام به آیتم های جداگانه از لیست نه به یک ایتم مشترک؟

FastCode
چهارشنبه 01 اردیبهشت 1389, 22:17 عصر
برای مورد یک معمولا" جواب منفیه.
برای دو همیشه جواب مثبته.
چرا از http://en.wikipedia.org/wiki/Circular_buffer استفاده نمیکنید؟

mehdi.mousavi
پنج شنبه 02 اردیبهشت 1389, 12:01 عصر
کسی از دوستان نمیتونه راهنمایی کنه؟ اینکه اگر دو Thread با هم مقدار یک منبع مشترک را فقط بخوانند آیا باز هم نیاز به Synchronization هست؟ یا اینکه اگر مثلاً یک List داشته باشیم که یک Thread همواره آیتم هایی به انتهای لیست اضافه می کنه و Thread دوم نیز از ابتدای لیست یک آیتم را خوانده و پس از پردازش آن آیتم را از اول لیست حذف می کند. آیا اینجا هم نیاز به Synchronization هست؟ با توجه به اینکه هر دو Thread به یک List مشترک دسترسی دارند اما هر کدام به آیتم های جداگانه از لیست نه به یک ایتم مشترک؟

سلام.
اگر منظورتون "واقعا فقط خواندنی" باشه، نه. مشکلی پیش نمیاد و میتونید با خیال راحت اینکارو کنید. اما اینکه لیستی داشته باشید که دو Thread مختلف یکی بخواد بخونه و Item ازش حذف کنه، یکی دیگه بخواد Item توش Insert کنه، بله. باید حتما اینکارو Thread Safe انجام بدید.

موفق باشید.