【发布时间】:2019-12-29 01:10:19
【问题描述】:
我的问题是,在阅读有关线程的信息时,如果多个线程访问一个变量,就会发生竞争条件。我的直觉是,在这种情况下,我的代码会为“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”并且会发生竞争条件,但我的代码并非如此
【问题讨论】:
-
未定义行为的有趣之处在于,正确的结果在您可以拥有的结果集中。
-
您是如何得出不存在竞争条件的结论的?
-
相关的,如果不是骗子的话:stackoverflow.com/questions/57603868/…
-
还应注意,编译器甚至可能不会生成与您在 Wikipedia 上比较的示例完全相同的指令,因此您不应该只寻找
a == 1来检测比赛。即使a == 2,您正在看到竞争条件;你怎么知道哪个线程首先增加了a?
标签: c++ multithreading c++11 race-condition