C++使用Atomic与多线程操作数组求和结果不一致问题咨询
问题根因分析
你的代码存在两处核心的竞态问题,直接导致求和结果不一致:
- 非线程安全的vector操作
std::vector的back()、pop_back()接口本身没有做线程安全保护,100个线程同时读写同一个vector会触发未定义行为:可能出现多个线程读取到同一个末尾元素、多次pop漏掉部分元素、甚至vector为空时调用back()触发越界崩溃,这就导致参与多线程求和的元素本身就和单线程遍历的元素不一致。 - 原子变量的累加操作不具备原子性
你目前对out的更新逻辑是拆分的两步:先load读当前值,加完next后再store写回。哪怕用了memory_order_relaxed内存序,这两步组合起来依然不是原子操作:多个线程可能同时读到同一个out旧值,各自累加后写回的结果会互相覆盖,最终漏掉部分线程的累加值。正确的原子累加应该直接调用fetch_add接口:out.fetch_add(next, std::memory_order_relaxed),保证读-改-写整个过程是原子的。
内容的提问来源于stack exchange,提问作者AKRA
相关产品推荐
相关产品推荐

