در 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 برای کاهش سربار قفل‌گذاری استفاده کنید.

توسط پژوهشگر در 221 روز قبل ساعت 01:37
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 221 روز قبل ساعت 12:34

برای عملکرد بهتر در Real-Time/HPC، از std::atomic<int> با fetch_add و memory_order_relaxed استفاده کنید تا از سربار قفل کاسته شود. اگر از mutex استفاده می‌کنید، حداقل بخش بحرانی را محدود کنید و RAII با std::lock_guard را فراموش نکنید تا استثناها مدیریت شوند. یک راه دیگر، هر ترد یک شمارنده محلی داشته باشد و در پایان با جمع تمام شمارنده‌ها مقدار نهایی را به دست آورید تا رقابت را کاهش دهید. فراموش نکنید که کامپایل با -pthread و احتیاجات هدرها را رعایت کنید.

گزارش

1 پاسخ

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

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