线程是否有可能(理论上)acquire
在一个 CPU 上执行,然后立即被抢占并在另一个acquire
从未执行过的 CPU 上恢复(因此根据释放-获取语义从不同步)?
例如。考虑以下代码,它使用 C++11 原子和release-acquire
内存排序来执行无锁线程安全初始化:
if ( false == _initFlag.load(memory_order_acquire) ) {
_foo = ...; // initialize global
_bar = ...; // initialize global
... = ...; // initialize more globals
_initFlag.store(true, memory_order_release);
}
// use the initialized values ...
如果_initFlag.load(memory_order_acquire)
返回 true,那么调用线程将知道 , 等的初始化值对_foo
当前正在执行_bar
的 CPU 是可见的(传播的)。但是如果线程在之后立即被抢占并移动到另一个 CPU 怎么办?
C++11 标准是否保证新 CPU 会同步?是否有任何实现或架构可能容易受到这种竞争条件的影响?