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将同步?是否有任何可能容易受到此类竞争条件影响的实施或架构?
在获取之后它有可能被抢占并移动到另一个CPU,但据我所知,O/S必须确保保留任何显式内存排序(这可能是它保留的内容)线程状态).否则,在多CPU环境中可靠运行的可能性很小.
我认为标准假设是这样,在必须的基础上.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |