4
線程是否有可能在一個CPU上執行acquire
,然後立即在另一個CPU上被搶佔並恢復,而acquire
從未執行過(因此從未按照發布獲取語義進行同步)?搶先式多任務干擾C++ 11版本 - 獲取語義?
例如,考慮下面的代碼,它使用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將被同步?是否有任何實現或體系結構可能容易受到這種競爭條件的影響?
需要執行任何必要的操作來提供C++指定的保證。如果一個程序根據C++虛擬機正確同步,那麼它將在任何正確的C++實現上同步。 C++不會像「除非執行的線程移動到另一個CPU上之前發生 - 在B之前發生」。 – bames53