无同步机制下,线程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
相关产品推荐
相关产品推荐

