کدی به زبان C++ بنویسید که یک شمارندهٔ مشترک از نوع std::atomic را بین چند ترد به‌اشتراک بگذارد، هر ترد شمارنده را N بار افزایش دهد و در پایان مقدار نهایی شمارنده و زمان اجرا را چاپ کند به‌طوری که از داده‌دَوَران (data race) جلوگیری شود.

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

0.0

برای حل این مسئله از هدر و کلاس std::atomic استفاده کنید و با std::thread چند ترد ایجاد کنید؛ هر ترد در یک حلقه N بار شمارنده را با ++ یا fetch_add(1) افزایش می‌دهد و سپس همه تردها را join کنید و مقدار نهایی را چاپ کنید. برای بهبود کارایی در سناریوهای Real-Time/HPC می‌توانید از memory_order_relaxed یا fetch_add با ordering مناسب استفاده تا از قفل‌ها اجتناب و تاخیر کاهش یابد؛ برای مبتدیان کافی است از رفتار پیش‌فرض atomic استفاده کنید و با -std=c++11 یا بالاتر برنامه را کامپایل کنید.

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

برای جلوگیری از data race از یک شمارنده مشترک از جنس std::atomic استفاده کنید و هر ترد با ++ یا fetch_add(1) آن را افزایش دهد. برای بهبود کارایی در Real-Time/HPC می‌توانید از memory_order_relaxed استفاده کنید تا از قفل‌ها و تاخیرها کاسته شود، اما در برخی موارد به ترتیب پیش‌فرض نیاز دارید تا رفتار قابل‌اعتمادی داشته باشید. برای اندازه‌گیری زمان اجرا از std::chrono و steady_clock استفاده کنید تا اندازه‌گیری زمان مستقل از تغییرات کارکرد سیستم باشد. در پایان، تمامی تردها را با join فراخوانی کنید تا مقدار نهایی را چاپ کنید، که معمولاً برابر با N ضربدر تعداد تردها می‌باشد.

گزارش

1 پاسخ

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

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