我用的vector<atomic<bool>>
是C++,代码在这里:
#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次,是.txt文件长度的一半vector<atomic<bool>>
。
我预计输出将为1111111111
(十个 1)。
谁能告诉我为什么?谢谢!!!!
您在每次交换中重复使用相同的变量,因此如果
flags[i]
在true
第一次迭代中,old_flags
则将true
在第二次迭代中。然后,如果
flags[i]
在false
第三次迭代中,则再次old_flags
变为false
。这种翻转意味着您只修改 中的所有其他元素
flags
。将声明移至
bool old_val = false;
循环内。您的线程彼此竞争,但不是出于线程安全原因。我们看到的是一个完美的数学统计数据,将值翻转为“是”和“否”(有时这是故意这样做的)。
输出:
你明白发生了什么事吗?
compare_exchange_strong
它的参数有副作用,它保存检测到的值。这是一场州比赛(不要与比赛条件混淆)。你的代码应该是: