为什么此代码不创建竞争条件?
Why does this code not create a 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" 并且发生了竞争条件,但我的代码并非如此
确实如此。
你只是还没有看到它的任何症状,纯属偶然。
(我希望一次创建和存储这些线程比增量本身慢得多,所以当你进入下一个线程时,最后一个线程的增量是 通常已经完成了。但是你不能保证这一点,这是一个典型的竞争条件。)
你should/must递增a
原子,或者用互斥量同步它。
这是不幸的未定义行为的完美示例。
它只是愚弄你期望的结果,你永远不知道它会在何时何地打你的脸。
您可以添加调试消息来打印增量函数的线程号和值。
如果增量按线程号顺序排列,则不存在竞争条件。
还有一点:你在竞争条件下期望什么,这只是增加内存位置的值。不是会导致死锁情况的数据库
我的问题是,在阅读有关线程的内容时发现,如果多个线程访问一个变量,就会发生竞争条件。我的直觉是,在这种情况下,我的代码会为 "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" 并且发生了竞争条件,但我的代码并非如此
确实如此。
你只是还没有看到它的任何症状,纯属偶然。
(我希望一次创建和存储这些线程比增量本身慢得多,所以当你进入下一个线程时,最后一个线程的增量是 通常已经完成了。但是你不能保证这一点,这是一个典型的竞争条件。)
你should/must递增a
原子,或者用互斥量同步它。
这是不幸的未定义行为的完美示例。
它只是愚弄你期望的结果,你永远不知道它会在何时何地打你的脸。
您可以添加调试消息来打印增量函数的线程号和值。 如果增量按线程号顺序排列,则不存在竞争条件。
还有一点:你在竞争条件下期望什么,这只是增加内存位置的值。不是会导致死锁情况的数据库