You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:19:53