یک برنامهٔ 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 کافی و امن است.

توسط پژوهشگر در 202 روز قبل ساعت 02:20
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 202 روز قبل ساعت 10:05

این تمرین به شما نشان می‌دهد چگونه با std::mutex از رقابت داده‌ها میان N نخ جلوگیری کنید و با std::lock_guard، بخش بحرانی افزایش شمارنده را ایمن کنید. نتیجه نهایی باید برابر با N ضرب در M باشد؛ اگر برابر نبود، ممکن است یا نخ‌ها را به درستی join نکرده باشید یا به طور تصادفی شمارنده را به روز رسانی کرده‌اید. برای اجرا در لینوکس از پرچم -pthread استفاده کنید و مطمئن شوید که mutex به طور صحیح بین نخ‌ها به اشتراک گذاشته شده است. اگر می‌خواهید کارایی را بهبود دهید، می‌توانید از گزینه‌های بدون قفل مانند std::atomic یا الگوریتم‌های کاهش استفاده کنید، اما برای سطح مبتدی استفاده از std::mutex و lock_guard کافی و امن است.

گزارش

1 پاسخ

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

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