atomic_bool的compare_exchange_weak循环示例作用及替代方案疑问
关于
compare_exchange_weak替代store(true)的疑问解答 先看示例代码:
bool expected = false; extern atomic_bool b; // set somewhere else while(!b.compare_exchange_weak(expected, true) && !expected);
你观察到的结论没错:这段代码最终会确保b的值为true,但它和直接调用b.store(true)有两个核心区别:
写操作的条件性
b.store(true)是无条件覆盖——不管b当前是什么值,都会执行一次写操作,触发内存同步(比如缓存失效)。而这段CAS代码只有在b原本是false时才会执行写操作;如果b已经是true,循环会直接退出,不会产生任何写操作。这在高并发场景下能减少不必要的内存总线开销,避免无意义的缓存同步。代码的演示目的
这段代码本质是用来演示compare_exchange_weak如何处理虚假失败的示例。compare_exchange_weak允许CPU在没有竞争的情况下也返回失败(虚假失败),这时候就需要循环重试;而compare_exchange_strong会额外检查是否真的存在竞争,性能略低。这段代码的重点是展示如何用循环配合compare_exchange_weak来规避虚假失败的影响,而不是单纯实现“设置为true”的功能。
当然,如果你的需求只是无条件把b设为true,直接用b.store(true)更简洁高效。但如果需要在设置的同时感知b的初始状态,或者想避免不必要的写操作,这种CAS写法就有它的价值。
内容的提问来源于stack exchange,提问作者bot654321
相关产品推荐
相关产品推荐

