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

无同步机制下,线程A是否必然能感知线程B的修改并终止?

线程同步与原子操作相关问题解答

问题1:在无同步的无限循环中,线程A是否必然能最终感知到线程B的修改?

不一定。没有同步机制的情况下,编译器和CPU会进行各种优化——比如把线程A循环中读取的变量缓存到寄存器里,全程不再从主存重新读取。这种情况下,线程B对主存中变量的修改,线程A永远都看不到。从内存模型的角度来说,无同步场景下线程间的内存操作没有任何可见性保证,线程B的修改完全可能对线程A不可见。

问题2:假设存在一个未同步的原子标志is_finished,代码如下:

// thread A
while(!is_finished.test(memory_order_relaxed)) {
    // 此处存在可观测的副作用
}
// thread B
is_finished.test_and_set(memory_order_relaxed);

当两个线程并发执行时,线程A是否一定会终止?
仍然不一定。memory_order_relaxed仅保证原子操作本身的原子性,不提供任何内存可见性保证。线程B对is_finished的修改,线程A还是有可能看不到——编译器或CPU依旧可以把线程A中的test操作优化成只读取一次,之后一直用寄存器里的值循环。哪怕循环里有可观测的副作用,只要这个副作用和is_finished无关,编译器就可能做出这种优化。只有使用更强的内存序(比如memory_order_acquire / memory_order_release),或者在循环中加入同步操作,才能保证线程B的修改能被线程A看到,让循环终止。


内容的提问来源于stack exchange,提问作者con ko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:47:05