یک برنامه C++ بنویسید که با استفاده از هدر <thread> و std::thread آرایهای از اعداد را بهصورت موازی به چند نخ تقسیم کرده، جمع هر بخش را محاسبه و با استفاده از join نتایج را ترکیب کند.
9.0 بازدید آخرین ویرایش در 201 روز قبل ساعت 03:38آرایه را به تعداد نخهای موردنظر (مثلاً برابر با std::thread::hardware_concurrency()) تقسیم کنید، برای هر بخش یک std::thread ایجاد کنید که جمع محلی آن بخش را محاسبه کند و نتیجه را در یک بردار نتایج با ایندکس جداگانه ذخیره کند تا از race condition جلوگیری شود؛ سپس همه نخها را با join منتظر بمانید و مجموع نهایی را از جمع مقادیر محلی بسازید. برای پیادهسازی میتوانید از تابع یا لامبدای C++ برای بدنه نخ استفاده کنید و هنگام تقسیمبندی به باقیماندهٔ بخشها دقت کنید تا همه عناصر پردازش شوند. نکات: از همزماننویسی روی متغیرهای مشترک پرهیز کنید یا در صورت نیاز از مکانیزمهای همگامسازی استفاده کنید، با استفاده از مقادیر محلی و نوشتن در اندیسهای جداگانه معمولاً نیازی به mutex نیست؛ در سیستمهای Real-Time و HPC کمینهسازی همگامسازی و انتخاب تعداد نخ مناسب برای افزایش کارایی مهم است، و همیشه قبل از خروج برنامه تمام نخها را join کنید.
برای کارایی بهتر، تقسیم آرایه را به گامهای برابر با باقیمانده درست انجام دهید تا هیچ عنصر پردازش نشده نماند. هر نخ نتیجه محلی خود را در یک اندیس منحصربهفرد در بردار نتایج ذخیره کند تا از race condition جلوگیری شود و نیازی به mutex نباشد. حتماً همه نخها را با join منتظر پایان کار کنید تا مجموع نهایی را از جمع مقادیر محلی بسازید. در سیستمهای Real-Time و HPC، تعداد نخها را با hardware_concurrency مقایسه کنید و برای کاهش همزمانی غیرضروری، بارکاری را بهطور مناسب تراز کنید.
گزارش