MiddleДебаггингЧастоЕщё не отвечали
Почему этот многопоточный счётчик неверен и как это исправить?
worker() запускается в нескольких std::thread, и итоговый counter слишком мал.
int counter = 0;
void worker() { for (int i = 0; i < 100000; ++i) ++counter; }
// запускаем worker() в нескольких std::thread, затем join всех
Найдите и исправьте ошибку.
Гонка данных: ++counter — несинхронизированная операция «чтение-изменение-запись» между потоками, что является неопределённым поведением, поэтому итоговое значение непредсказуемо. Решение: std::atomic<int> counter{0} (тогда ++counter атомарен) или защитить инкремент std::mutex + lock_guard.
- ✗Считать
++атомарным, потому что это один оператор или одна инструкция - ✗Думать, что
volatileобеспечивает потокобезопасность - ✗Полагать, что потерянные обновления лишь замедляют, а не портят результат
- →Почему
volatileне заменяетstd::atomicв C++? - →Когда для счётчика
std::mutexпредпочтительнееstd::atomic?