در برنامهای به زبان C++، یک شمارندهٔ مشترک را با استفاده از std::mutex محافظت کنید؛ چندین thread بسازید که هر کدام 1000 بار شمارنده را افزایش دهند و در پایان مقدار نهایی را چاپ کنید تا نشان دهید عملیات بهصورت thread-safe انجام شده است.
48.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 06:00 0.0
برای حل مسئله از هدرهای و (و همچنین و ) استفاده کنید؛ یک متغیر شمارنده مشترک تعریف کرده و با std::mutex و std::lock_guard هر بار که یک ترد قصد افزایش شمارنده دارد قفل را بگیرید، عملیات افزایش را انجام دهید و سپس تردها را با join همگام کنید. نکات: از lock_guard برای مدیریت خودکار قفل استفاده کنید، قلمرو قفل را کوتاه نگه دارید تا کارایی بهتر شود و در سیستمهای Real-Time یا HPC به تأخیر قفلها توجه کنید و در صورت نیاز برای کارایی بالاتر بهجای mutex از atomic بهره ببرید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
از std::lock_guard برای مدیریت خودکار قفل استفاده کنید و محدودهٔ بخش بحرانی را تا حد ممکن کوتاه نگه دارید تا تداخل کاهش یابد. اگر کار فقط افزایش شمارنده است، std::atomic<int> میتواند جایگزین مناسبی برای std::mutex باشد تا سربار قفلگذاری حذف شود. برای بارهای سنگین یا سیستمهای HPC بهتر است هر ترد شمارندهٔ محلی خودش را نگه دارد و در پایان مقادیر را جمع کنید تا contention کاهش یابد. همیشه تردها را با join همگام کنید، در C++17 میتوانید از std::scoped_lock برای قفلهای چندگانه استفاده کنید و مراقب استثناها باشید تا قفلها بهدرستی آزاد شوند.
گزارش