با استفاده از std::thread و std::mutex یک برنامه بنویسید که یک شمارندهٔ مشترک را با N نخ هم‌زمان هر کدام M بار افزایش دهد و در پایان مقدار نهایی شمارنده را چاپ کند.

0.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:23

0.0

برای حل، از هدرهای و (و همچنین و ) استفاده کنید؛ شمارندهٔ مشترک را در یک متغیر صحیح قرار دهید و قبل از هر افزایش از std::lock_guard برای محافظت از بخش بحرانی بهره ببرید و در پایان تمام نخ‌ها را join کنید تا مقدار نهایی برابر N*M شود. نکات: قفل را کوتاه نگه دارید تا تداخل کاهش یابد، برای مقایسهٔ کارایی در محیط‌های Real-Time یا HPC می‌توانید زمان‌بندی ساده‌ای اضافه کنید و در صورت نیاز به کارایی بالاتر از std::atomic یا قفل‌های سبک‌تر استفاده کنید.

توسط پژوهشگر در 221 روز قبل ساعت 01:23
دسته بندی ها: C Plus Plus C Plus Plus for beginner
nima در 221 روز قبل ساعت 13:25

این پیاده‌سازی با std::mutex و std::lock_guard ایمن است، چون هر افزایش شمارنده را در یک بخش بحرانی محافظت می‌کند. برای کاهش تاخیر و رقابت بین نخ‌ها، طول بخش بحرانی را محدود نگه دارید و صرفاً مقدار لازم را در قفل نگه دارید. اگر هدف کارایی بیشتر است، می‌توانید در موارد ساده از std::atomic<long long> با عملیات fetch_add استفاده کنید تا از قفل پرهیز شود. همچنین مطمئن شوید اندازهٔ دادهٔ شمارنده کافی است تا مقدار N*M را بدون overflow نگهداری کند.

گزارش

1 پاسخ

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

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