gpt4 book ai didi

c++ - 为什么跨线程更改共享变量的代码显然不会受到竞争条件的影响?

转载 作者:IT老高 更新时间:2023-10-28 11:53:10 25 4
gpt4 key购买 nike

我正在使用 Cygwin GCC 并运行以下代码:

#include <iostream>
#include <thread>
#include <vector>
using namespace std;

unsigned u = 0;

void foo()
{
u++;
}

int main()
{
vector<thread> threads;
for(int i = 0; i < 1000; i++) {
threads.push_back (thread (foo));
}
for (auto& t : threads) t.join();

cout << u << endl;
return 0;
}

使用以下行编译:g++ -Wall -fexceptions -g -std=c++14 -c main.cpp -o main.o

它打印 1000,这是正确的。但是,由于线程覆盖了先前增加的值,我预计数量会更少。为什么这段代码不受互访的影响?

我的测试机有4个核心,我对我所知道的程序没有任何限制。

将共享 foo 的内容替换为更复杂的内容时问题仍然存在,例如

if (u % 3 == 0) {
u += 4;
} else {
u -= 1;
}

最佳答案

foo() 太短了,以至于每个线程可能在下一个线程产生之前就完成了。如果你在 foo() 中的 u++ 之前添加一个随机时间的 sleep ,你可能会开始看到你所期望的。

关于c++ - 为什么跨线程更改共享变量的代码显然不会受到竞争条件的影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41816495/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com