C++多线程环境下vector<atomic<bool>>的异常问题咨询
问题原因分析
你的代码核心问题在于**compare_exchange_strong的预期值old_val没有在每次尝试新的flags[i]时重置为false**。
具体过程如下:
- 每个线程的
old_val仅在lambda开始时初始化一次为false。 - 当线程尝试一个已被其他线程设为
true的flags[i]时,compare_exchange_strong失败,old_val会被更新为当前flags[i]的值(true)。 - 接着线程尝试下一个
flags[i](此时值为false),但old_val是true,与flags[i]的false不匹配,compare_exchange_strong再次失败,old_val被更新为false。 - 若后续
flags[i]的true/false交替出现,线程会在遍历中持续错过未被设置的false元素,无法完成设置操作。
当n=10时,前5个线程成功抢占了前5个flags元素并设为true,后续线程遍历会因old_val的交替变化,无法匹配到剩下的5个false元素,最终只能输出5个1。
修正后的代码
只需将old_val的定义移到内层循环中,每次尝试新的flags[i]时都重置预期值为false:
#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([&](){ for (int i = 0; i < n; i++) { bool old_val = false; // 每次尝试都重置预期值 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设为多大,输出都会是10个1,符合预期。
内容的提问来源于stack exchange,提问作者yilin cai
相关产品推荐
相关产品推荐

