یک برنامه C++ بنویسید که با استفاده از چند نخ (std::thread) و std::mutex یک شمارندهٔ مشترک را توسط N نخها هرکدام M بار افزایش دهد و مقدار نهایی شمارنده را چاپ کند، بهطوریکه همزمانی و امنیت دادهها حفظ شود.
5.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 03:00 0.0
برای حل این مسئله از هدرهای و (و نیز و ) استفاده کنید: یک شمارندهٔ مشترک (مثلاً int) تعریف کنید، یک std::mutex برای محافظت از دسترسی به شمارنده ایجاد کنید و برای هر نخ یک تابع کاری بسازید که در هر بار افزایش، قبل از تغییر مقدار، قفل را با std::lock_guard بگیرد و پس از تغییر آن را رها کند؛ سپس همهٔ نخها را با join همگامسازی کنید و مقدار نهایی را چاپ کنید. نکات: بخش بحرانی (قفلشده) را کوتاه نگه دارید تا کارایی در سناریوهای Real-Time/HPC بهتر شود، از deadlock جلوگیری کنید و برای شبیهسازی کار واقعی میتوانید از std::this_thread::sleep_for استفاده کنید، گرچه در کاربردهای HPC باید از معایب خواب در نخها آگاه باشید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
طرح شما خوب است و با استفاده از mutex و lock_guard امنيت دسترسي به شمارنده را حفظ ميکند. برای کارایی بیشتر میتوان از std::atomic<int> با عمل fetch_add استفاده کرد تا از دخالت مکرر قفل اجتناب شود. همچنين محدودهٔ قفل را تا حد ممکن محدود کنيد تا بخش بحراني کوتاه بماند و از بنبست و انتظار اضافي جلوگيري شود. در نهايت با join کردن نخها مقدار نهايي برابر با N*M خواهد بود.
گزارش