در C Plus Plus بنویسید برنامهای که یک شمارندهٔ مشترک را با N ترد که هر کدام M بار آن را افزایش میدهند بهصورت thread-safe با استفاده از محافظت کند و مقدار نهایی شمارنده را چاپ کند.
4.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:37 0.0
یک شمارندهٔ مشترک (مثلاً int counter = 0) و یک std::mutex تعریف کنید، سپس N ترد با std::thread ایجاد کنید که هر ترد در حلقهای به تعداد M بار با استفاده از std::lock_guard قفل را گرفته و شمارنده را افزایش دهد؛ پس از پایان همه تردها با join مقدار نهایی را چاپ کنید. از هدرهای , , , استفاده کنید و برنامه را با -pthread کامپایل کنید. برای عملکرد بهتر و کاربرد در سیستمهای Real-Time/HPC قفل را کوچک و فقط شامل عملیات افزایش نگه دارید، از std::lock_guard برای ایمنی در برابر استثناها بهره ببرید و اگر فقط افزایش ساده لازم است میتوانید بهعنوان جایگزین از std::atomic برای کاهش سربار قفلگذاری استفاده کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای عملکرد بهتر در Real-Time/HPC، از std::atomic<int> با fetch_add و memory_order_relaxed استفاده کنید تا از سربار قفل کاسته شود. اگر از mutex استفاده میکنید، حداقل بخش بحرانی را محدود کنید و RAII با std::lock_guard را فراموش نکنید تا استثناها مدیریت شوند. یک راه دیگر، هر ترد یک شمارنده محلی داشته باشد و در پایان با جمع تمام شمارندهها مقدار نهایی را به دست آورید تا رقابت را کاهش دهید. فراموش نکنید که کامپایل با -pthread و احتیاجات هدرها را رعایت کنید.
گزارش