我的问题是,在阅读有关线程的信息时,出现了一个问题,即如果多个踏步访问一个变量,则会发生竞争条件。我的直觉是,在这种情况下,我的代码会为“ 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”,并且会出现竞争条件,但是我的代码不是这种情况
答案 0 :(得分:8)
由于纯属偶然,您只是尚未目睹任何症状。
(我希望一次创建和存储这些线程比增量本身要慢得多,所以到您进入下一个线程时,从上一个线程开始的增量通常是 < / strong>已经完成。但是您不能保证这是经典的比赛条件。
您应该/必须在原子上递增a
,或使其与互斥锁同步。
答案 1 :(得分:6)
答案 2 :(得分:0)
您可以添加调试消息以打印线程号和增量函数的值。 如果按线程号的顺序递增,则没有竞争条件。
还有一点:在竞争条件下您期望什么,这只是增加一个存储位置的值。这不是一个会导致死锁状态的数据库