2013-05-31 39 views
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將被同步?是否有任何實現或體系結構可能容易受到這種競爭條件的影響?

+4

需要執行任何必要的操作來提供C++指定的保證。如果一個程序根據C++虛擬機正確同步,那麼它將在任何正確的C++實現上同步。 C++不會像「除非執行的線程移動到另一個CPU上之前發生 - 在B之前發生」。 – bames53

回答

6

它可能被搶佔並在獲得後移動到另一個CPU,但據我所知,操作系統必須確保任何顯式的內存順序被保留(這可能是它保持線程狀態)。否則,在多CPU環境下可靠運行的可能性非常小。

我認爲該標準假定情況是這樣,在它的基礎上。