抢先式多任务是否会干扰C ++ 11发布 - 获取语义?

时间:2013-05-31 16:35:32

标签: c++ c++11 memory-barriers

是否(理论上​​)线程可以在一个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将同步?是否有任何可能容易受到此类竞争条件影响的实施或架构?

1 个答案:

答案 0 :(得分:6)

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

我认为标准假设是基于它必须的情况。