为什么此代码不创建竞争条件?

时间:2019-08-23 17:43:10

标签: c++ multithreading c++11 race-condition

我的问题是,在阅读有关线程的信息时,出现了一个问题,即如果多个踏步访问一个变量,则会发生竞争条件。我的直觉是,在这种情况下,我的代码会为“ int a”创建竞争条件,例如https://en.wikipedia.org/wiki/Race_condition#Example,但不会发生。我的问题是为什么会这样?

我尝试在数组中分别创建多个线程,但是没有出现竞争条件。

void increment(int& a) {
    ++a;
}

int main()
{

    int a = 0;

    std::thread pool[100];

    for (auto& t : pool) {
        t = std::thread(increment, std::ref(a));
    }


    for (auto& t : pool) {
        t.join();
    }

    printf("%d", a);

}

我希望只有一些线程实际上会增加“ a”,并且会出现竞争条件,但是我的代码不是这种情况

3 个答案:

答案 0 :(得分:8)

是。

由于纯属偶然,您只是尚未目睹任何症状。

(我希望一次创建和存储这些线程比增量本身要慢得多,所以到您进入下一个线程时,从上一个线程开始的增量通常是 < / strong>已经完成。但是您不能保证这是经典的比赛条件。

您应该/必须在原子上递增a ,或使其与互斥锁同步。

答案 1 :(得分:6)

这是不幸的未定义行为的完美示例。

它只是愚弄您期望的结果,而且您​​永远都不知道它何时何地会打到您的脸上。

为防止这种情况,您必须使用atomics或使用mutex

答案 2 :(得分:0)

您可以添加调试消息以打印线程号和增量函数的值。 如果按线程号的顺序递增,则没有竞争条件。

还有一点:在竞争条件下您期望什么,这只是增加一个存储位置的值。这不是一个会导致死锁状态的数据库