Два потока инкрементируют общий счётчик
int counter = 0;
void worker() {
for (int i = 0; i < 100000; ++i) {
++counter;
}
}
std::thread t1(worker), t2(worker);
t1.join(); t2.join();
std::cout << counter;
Что напечатает программа?
- Ровно `200000`: инкремент целого выполняется одной инструкцией процессора
- Ровно `100000`: у каждого потока своя копия глобальной переменной
- Ровно `200000`, если пометить `counter` как `volatile`: это ключевое слово запрещает держать переменную в регистре и делает доступ к ней атомарным
- Значение от `100000` до `200000`: это гонка данных, часть инкрементов теряется
