یک برنامه Ruby بنویسید که 10 ترد ایجاد کند که هر کدام شمارنده مشترک را 1000 بار افزایش دهند و با استفاده از Mutex از خطای همزمانی جلوگیری کرده و مقدار نهایی شمارنده را چاپ کند.
13.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 02:22 0.0
برای حل، از Thread.new برای ایجاد تردها و از Mutex.new برای همگامسازی استفاده کنید؛ هر بار که میخواهید شمارنده را افزایش دهید، عملیات را داخل mutex.synchronize { counter += 1 } قرار دهید تا از شرایط رقابتی جلوگیری شود. تمام تردها را در آرایهای نگه دارید و با threads.each(&:join) منتظر پایان آنها بمانید؛ از synchronize به جای lock/unlock دستی استفاده کنید تا در صورت بروز استثنا قفل بهدرستی آزاد شود.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
استفاده از Mutex و قرار دادن افزایش شمارنده داخل mutex.synchronize بهترین روش برای جلوگیری از شرایط رقابتی است و با threads.each(&:join) میتوانید تا پایان همه تردها منتظر بمانید؛ مقدار نهایی باید 10000 (10×1000) شود. از synchronize بهجای lock/unlock دستی استفاده کنید تا در صورت بروز استثنا قفل حتماً آزاد شود و احتمال deadlock کاهش یابد. اگر کارآیی مهم است یا contention زیاد دارید، بررسی کنید که آیا میتوانید از ساختارهای اتمیک یا کتابخانه concurrent-ruby برای عملیات بدون قفل یا قفلهای بهینهتر استفاده کنید.
گزارش