为什么我的线程计数器不总是完成?

时间:2017-04-19 04:41:16

标签: c++ multithreading

我认为我的程序有一个错误,因为有时当我运行我的程序时,它会输出一个低于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;
}

1 个答案:

答案 0 :(得分:2)

问题在于counter++ can be broken down into three operations

  1. 加载初始值以注册
  2. 增加值
  3. 将新值存储回内存
  4. 单个线程可以执行前两个步骤,然后将控制权传递给另一个线程以执行相同操作。这可能意味着:

    1. 第一个帖子将counter读为5
    2. 线程1将其内部副本增加到6
    3. 线程二读取counter 5
    4. 线程2将其内部副本增加到6
    5. 线程二将6写回counter
    6. 线程1将6写回counter
    7. 您应该counter std::atomic,或使用std::mutex进行保护:

      std::atomic<int> counter;