是否(理论上)线程可以在一个CPU上执行acquire
,然后立即抢占并在另一个从未执行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将同步?是否有任何可能容易受到此类竞争条件影响的实施或架构?
答案 0 :(得分:6)
在获取之后它可能被抢占并移动到另一个CPU,但据我所知,O / S必须确保保留任何显式内存排序(这可能是某些东西)它保持在线程状态)。否则,在多CPU环境中可靠运行的可能性很小。
我认为标准假设是基于它必须的情况。