این تمرینها بر پایهی درس شرایط رقابتی (Race Condition) هستند.
تمرین ۱ (مفهومی)
Race Condition دقیقاً در چه شرایطی رخ میدهد؟ با اشاره به مثال شمارندهی مشترک (counter) و سه گامِ «خواندن، تغییر، نوشتن»، توضیح دهید چرا مقدار نهایی با مقدار موردانتظار (صفر) متفاوت میشود.
تمرین ۲ (مفهومی)
در مثال دو آشپز و یک دیگ، چرا وجود دو آشپز بهخودیخود بد نیست، اما نتیجهی کار (آش) ممکن است خراب شود؟ نقش سرآشپز با چه مفهومی در برنامهنویسی هماهنگ است؟
تمرین ۳ (مفهومی)
کدی که هیچ مشکل Race Condition ندارد چه نامیده میشود؟
تمرین ۴ (مفهومی)
وقتی یک منبع اشتراکی توسط یک ترد قفل (lock) شده و هنوز release نشده، تردهای دیگر باید چه کاری انجام دهند؟
تمرین ۵ (کد)
یک سناریوی «فروش بیش از ظرفیت» بنویسید: فقط ۱ بلیت موجود است و ۵ خریدار همزمان تلاش میکنند بخرند. ابتدا نسخهی معیوب (بدون قفل) که ممکن است بیش از ۱ بلیت بفروشد را بنویسید، سپس نسخهی درست با Lock.
تمرین ۶ (کد)
یک حساب بانکی با موجودی ۱۰۰ و دو برداشت همزمان ۸۰ واحدی را در نظر بگیرید. با Lock کاری کنید که فقط یکی از برداشتها انجام شود و موجودی هرگز منفی نشود.
تمرین ۷ (کد)
نشان دهید که در ThreadPoolExecutor هم Race Condition ممکن است رخ دهد و چطور با threading.Lock آن را برطرف میکنید. (چند کارِ submitشده روی یک منبع مشترک کار کنند.)