我认为我的程序有一个错误,因为有时当我运行我的程序时,它会输出一个低于30000的数字,例如29999.但有时它会正确运行并进入30000.我的问题是如何解决这个问题和为什么会这样。
#include <iostream>
#include <thread>
using namespace std;
int counter;
int i;
void increment()
{
counter++;
}
int main()
{
counter = 0;
cout << "The value in counter is : " << counter << endl;
thread tarr[30000];
for (i = 0; i < 30000; i++)
{
tarr[i] = thread(increment);
}
for (i = 0; i < 30000; i++)
{
tarr[i].join(); //main thread waits for tarr to finish
}
cout << "After running 30,000 threads ";
cout << "the value in counter is : " << counter << endl;
return 0;
}
答案 0 :(得分:2)
问题在于counter++
can be broken down into three operations:
单个线程可以执行前两个步骤,然后将控制权传递给另一个线程以执行相同操作。这可能意味着:
counter
读为5
6
counter
5
6
6
写回counter
6
写回counter
您应该counter
std::atomic
,或使用std::mutex
进行保护:
std::atomic<int> counter;