C++多线程情况下向量的一个奇怪的事情<atomic<bool>>

问题描述 投票:0回答:1
我在C++中使用

vector<atomic<bool>>

,代码在这里:

#include <iostream> #include <thread> #include <atomic> #include <vector> using namespace std; int main() { int n = 10; int count = 20; vector<atomic<bool>> flags(n); vector<thread> jobs; for (int i = 0; i < count; i++) { jobs.emplace_back([&](){ bool old_val = false; for (int i = 0; i < n; i++) { if (flags[i].compare_exchange_strong(old_val, true)) { cout<<1; break; } } }); } for (int i = 0; i < count; i++) { jobs[i].join(); } return 0; }
不知道为什么,不管变量

count

的值是多少,输出内容始终是“11111”,也就是说
compare_exchange_strong()
只成功了5次,是
vector<atomic<bool>>
长度的一半.

我预计输出将是

1111111111

(十个 1)。

谁能告诉我为什么?谢谢!!!!

c++ multithreading atomic
1个回答
0
投票
您在每次交换中重复使用相同的变量,因此如果

flags[i]

 在第一次迭代中为 
true
,则 
old_flags
 在第二次迭代中将为 
true
这种翻转意味着您只修改
flags
 中的所有其他元素。

将声明

bool old_val = false;

 移至循环内。

© www.soinside.com 2019 - 2024. All rights reserved.