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

eth*_*ice 4 c++ memory-barriers c++11

是(理论上)线程可以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 ...
Run Code Online (Sandbox Code Playgroud)

如果_initFlag.load(memory_order_acquire)返回true,则调用线程会知道的初始化值_foo,_bar等...可见(传播)到CPU 上,它目前正在执行.但是如果线程在之后立即被抢占并移动到另一个CPU怎么办?

C++ 11标准是否保证新CPU将同步?是否有任何可能容易受到此类竞争条件影响的实施或架构?

Tom*_*ner 6

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

我认为标准假设是这样,在必须的基础上.