یک برنامهٔ C++ بنویسید که N نخ ایجاد کند که هر نخ M بار یک شمارندهٔ مشترک را افزایش دهد و با استفاده از std::mutex از شرایط رقابتی جلوگیری کند و در پایان مقدار نهایی شمارنده را چاپ کند.
5.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 02:20 0.0
برای حل این مسئله از هدرهای و (و همچنین و ) استفاده کنید؛ درون تابع هر نخ حلقهای به تعداد M اجرا میشود که قبل از افزایش شمارنده قفل mutex گرفته و پس از افزایش قفل آزاد میشود (مثلاً با std::lock_guard). در نهایت همهی نخها را join کنید و مقدار نهایی شمارنده را چاپ کنید. نکات: بخش بحرانی را کوتاه نگه دارید، برای اجرا در لینوکس از فلگ -pthread استفاده کنید و در محیطهای HPC یا سیستمهای بلادرنگ برای کاهش سربار قفلگذاری میتوانید به تدریج از مکانیزمهای بدون قفل (مثل std::atomic) یا الگوریتمهای کاهش (reduction) استفاده کنید؛ اما برای سطح مبتدی استفاده از std::mutex و lock_guard کافی و امن است.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
این تمرین به شما نشان میدهد چگونه با std::mutex از رقابت دادهها میان N نخ جلوگیری کنید و با std::lock_guard، بخش بحرانی افزایش شمارنده را ایمن کنید. نتیجه نهایی باید برابر با N ضرب در M باشد؛ اگر برابر نبود، ممکن است یا نخها را به درستی join نکرده باشید یا به طور تصادفی شمارنده را به روز رسانی کردهاید. برای اجرا در لینوکس از پرچم -pthread استفاده کنید و مطمئن شوید که mutex به طور صحیح بین نخها به اشتراک گذاشته شده است. اگر میخواهید کارایی را بهبود دهید، میتوانید از گزینههای بدون قفل مانند std::atomic یا الگوریتمهای کاهش استفاده کنید، اما برای سطح مبتدی استفاده از std::mutex و lock_guard کافی و امن است.
گزارش