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

Jen*_*röm 2 c++ multithreading race-condition c++11

我的问题是,在阅读有关线程的内容时,如果多个踏板访问一个变量,就会出现竞争条件。我的直觉是,在这种情况下,我的代码会为“ 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);

}
Run Code Online (Sandbox Code Playgroud)

我希望只有一些线程实际上会增加“ a”,并且会出现竞争条件,但是我的代码却并非如此

Lig*_*ica 8

是的

由于完全是偶然的机会,您只是还没有看到任何症状。

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

您应该/必须以a 原子方式递增,或将其与互斥锁同步。


Obl*_*ica 6

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

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

为了防止这种情况,您必须使用原子或使用互斥体