نمایش نتایج 1 تا 10 از 10

نام تاپیک: Thread و همگام سازی

  1. #1

    Thread و همگام سازی

    با سلام خدمت دوستان
    متأسفانه من هنوز مفهوم Synchronization را خوب متوجه نشده ام.من در فرم اصلی برنامه ام یک تایمر دارم که هر 100 میلی ثانیه یک مقدار را روی یک label روی فرم نمایش می دهد. از طرفی در thread دوم نیز اطلاعاتی را از بانک اطلاعاتی می خوانم و روی همان label نمایش می دهم. با توجه به اینکه هر دو thread به یک label مقدارهایی اختصاص می دهند در اینجا نیاز به Synchronization داریم درسته؟

  2. #2

    نقل قول: Thread و همگام سازی

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

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

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

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

  3. #3

    نقل قول: Thread و همگام سازی

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

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

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

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

  4. #4

    نقل قول: Thread و همگام سازی

    نقل قول نوشته شده توسط saed2006 مشاهده تاپیک
    .net برای پیاده سازی انچه در درس سیستم عامل خوندیم چه کلاس هایی رو داره و نحوه پیاده سازیش رو با یه مثال بیان میکنید
    تشکر
    سلام.
    برای مشاهده Synchronization Object ها در .NET میتونید به این سایت رجوع کنید. خوندن این مقاله رو نیز، به افرادیکه دوست دارن در این زمینه اطلاعاتشون رو بیشتر کنن، توصیه می کنم.

    موفق باشید.

  5. #5

    نقل قول: Thread و همگام سازی

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    سلام.
    برای مشاهده Synchronization Object ها در .NET میتونید به این سایت رجوع کنید. خوندن این مقاله رو نیز، به افرادیکه دوست دارن در این زمینه اطلاعاتشون رو بیشتر کنن، توصیه می کنم.

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

  6. #6

    نقل قول: Thread و همگام سازی

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

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

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

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

    موفق باشید.

  7. #7

    نقل قول: Thread و همگام سازی

    با تشکر از راهنمایی دوستان. حال اگر دو یا چند Thread به صورت همزمان یک منبع مشترک را بخوانند (مثلاً یک متغیر مشترک) ولی آنرا تغییر ندهند آیا باز هم نیاز به Synchronization است؟

  8. #8

    نقل قول: Thread و همگام سازی

    کسی از دوستان نمیتونه راهنمایی کنه؟ اینکه اگر دو Thread با هم مقدار یک منبع مشترک را فقط بخوانند آیا باز هم نیاز به Synchronization هست؟ یا اینکه اگر مثلاً یک List داشته باشیم که یک Thread همواره آیتم هایی به انتهای لیست اضافه می کنه و Thread دوم نیز از ابتدای لیست یک آیتم را خوانده و پس از پردازش آن آیتم را از اول لیست حذف می کند. آیا اینجا هم نیاز به Synchronization هست؟ با توجه به اینکه هر دو Thread به یک List مشترک دسترسی دارند اما هر کدام به آیتم های جداگانه از لیست نه به یک ایتم مشترک؟

  9. #9
    کاربر دائمی آواتار FastCode
    تاریخ عضویت
    تیر 1388
    محل زندگی
    /dev/null
    پست
    3,486

    نقل قول: Thread و همگام سازی

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

  10. #10

    نقل قول: Thread و همگام سازی

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

    موفق باشید.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •