(۲۳ آذر ۱۳۹۰ ۱۰:۳۳ ب.ظ)mam نوشته شده توسط: در شرایطی که هر دو از فرایند بیدار هستند٬ پردازنده به فرایند مصرفکننده میرسه. مصرفکننده که (در این فرض) بعد یک بار اجرای کامل تولیدکننده اجرا شده٬ متغیر Count رو برابر ۱ میبینه٬ اما در همین حین با وقوع یک وقفه٬ دوباره پردازنده دست تولیدکننده میرسه و اینباره تولیدکننده مقدار Count رو به ۲ میرسونه
در این صورت که شما شرح دادید اگر برنامه رو trace کنید می بینید که یکی از تولیدات از بین میره، ولی بن بست رخ نمیده.
یعنی
- مصرف کننده پس از مصرف خانه اول مقدار ۱ را داخل رجیستر خودش میریزه
- تولید کننده اجرا میشه و یکی تولید می کنه و در خانه شماره ۱ میریزه و count رو ۲ می کنه
- مصرف کننده ادامه میده: مقدار count رو ۰ می کنه، یک آشغال مصرف می کنه
- تولید کننده کار رو ادامه میده و آیتم های بعدی رو پر می کنه
در اینجا یک محصول از بین رفت و یک آشغال مصرف شد!
می تونید یک مثال بزنید که با وجود اینکه هر بار تولید کننده، مصرف کننده رو بیدار می کنه، باز هم خطر مشکل قبلی (خواب ابدی هر دو) وجود داره؟
در این trace بله منجر به بن بست نشد اما عملکرد منطقی نداشت!
(۲۳ آذر ۱۳۹۰ ۱۰:۳۳ ب.ظ)mam نوشته شده توسط: اساس ایجاد سمافورها برای جلوگیری از به هدر رفتن سیگنالهایی مانند این بود
البته این هدف نبود! اگر سیگنال به هدر بره و مشکلی پیش نیاد ما هم مشکلی با این اسراف نداریم!
اینکه سمافور اجازه به هدر رفتن سیگنال رو نمیده یک وسیله ای است که ما رو به هدف بالاتر یعنی همگام سازی رسوند