4

线程是否有可能(理论上)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 会同步?是否有任何实现或架构可能容易受到这种竞争条件的影响?

4

1 回答 1

6

它有可能在获取后被抢占并移动到另一个 CPU,但据我所知,O/S 必须确保保留任何显式内存顺序(这可能是它保留的东西线程状态)。否则,在多 CPU 环境中可靠运行的可能性很小。

我认为标准假定情况如此,在它必须如此的基础上。

于 2013-05-31T16:43:27.007 回答