یک برنامه 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 دستی استفاده کنید تا در صورت بروز استثنا قفل به‌درستی آزاد شود.

توسط پژوهشگر در 198 روز قبل ساعت 02:22
دسته بندی ها: Ruby Ruby for beginner
sara در 198 روز قبل ساعت 02:22

استفاده از Mutex و قرار دادن افزایش شمارنده داخل mutex.synchronize بهترین روش برای جلوگیری از شرایط رقابتی است و با threads.each(&:join) می‌توانید تا پایان همه تردها منتظر بمانید؛ مقدار نهایی باید 10000 (10×1000) شود. از synchronize به‌جای lock/unlock دستی استفاده کنید تا در صورت بروز استثنا قفل حتماً آزاد شود و احتمال deadlock کاهش یابد. اگر کارآیی مهم است یا contention زیاد دارید، بررسی کنید که آیا می‌توانید از ساختارهای اتمیک یا کتابخانه concurrent-ruby برای عملیات بدون قفل یا قفل‌های بهینه‌تر استفاده کنید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری