2013-10-30 13 views
2

在C++ 11中,std :: atomic可以用來在兩個線程之間傳輸非原子數據嗎?具體而言,以下4種語義都是由原子建立的嗎?在C++ 11中,std :: atomic可以用來在兩個線程之間傳輸非原子數據

  1. 原子 - 寫語句之前(談論執行時,包括由那些的C++語句生成的所有的機器指令)的原子寫入之前執行的所有語句。

  2. 在原子讀取後執行原子讀取後執行所有語句(當談到執行時,包括那些C++語句生成的所有機器指令)。

  3. 寫入原子之前的所有其他內存寫入都會提交到主內存。

  4. 所有其他讀取原子後的內存讀取操作都會從主內存中再次讀取(這意味着放棄線程緩存)。

我在這裏看到的例子:http://bartoszmilewski.com/2008/12/01/c-atomics-and-memory-ordering/

然而,在本例中,數據是原子,所以我的問題是,什麼如果數據非原子?

下面是一些代碼,展示了我想:

常見的數據:

std::atomic_bool ready; 
char* data; // or data of any other non atomic 

寫線程:

data = new char[100]; 
data[0] = 1; 
ready.store(true); // use default memory_order(memory_order_seq_cst), witch i think is the most restrict one 

讀線程:

if(ready.load()) { // use default memory_order(memory_order_seq_cst) 
    assert(data[0] == 1); // both data(of type char*) and data[0~99](each of type char) are loaded 
} 

回答

1

我想你必須使用內存命令:

data = new char[100]; 
data[0] = 1; 
ready.store_explicit(true, std::memory_order_release); 

if(ready.load_explicit(std::memory_order_aqcuire)) { 
    assert(data[0] == 1); // both data(of type char*) and data[0~99](each of type char) are loaded 
} 

(我不知道這句法_explicit

其實你的代碼是正確的,但在這種情況下,沒有必要秒/ CST內存秩序和acquire/release是正確的。 與release在原子寫入之後沒有寫入可以被重新排序並且acquire在原子載入之前沒有載入可以被重新排序,所以在原子載入之後所有載入都可以看到原子存儲之前的所有非原子存儲。

+8

默認的內存順序是'memory_order_seq_cst',它比'acquire/release'更具限制性。 – inf

+0

@bamboon哦,是的,你說得對,但我認爲任何一種方式都是正確的,不是嗎? – MRB

+0

是的,我認爲acq/rel應該足夠,因爲它可以確保所有寫入在其他線程中都可見。 – inf

相關問題