在C++ 11中,std :: atomic可以用來在兩個線程之間傳輸非原子數據嗎?具體而言,以下4種語義都是由原子建立的嗎?在C++ 11中,std :: atomic可以用來在兩個線程之間傳輸非原子數據
原子 - 寫語句之前(談論執行時,包括由那些的C++語句生成的所有的機器指令)的原子寫入之前執行的所有語句。
在原子讀取後執行原子讀取後執行所有語句(當談到執行時,包括那些C++語句生成的所有機器指令)。
寫入原子之前的所有其他內存寫入都會提交到主內存。
所有其他讀取原子後的內存讀取操作都會從主內存中再次讀取(這意味着放棄線程緩存)。
我在這裏看到的例子: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
}
默認的內存順序是'memory_order_seq_cst',它比'acquire/release'更具限制性。 – inf
@bamboon哦,是的,你說得對,但我認爲任何一種方式都是正確的,不是嗎? – MRB
是的,我認爲acq/rel應該足夠,因爲它可以確保所有寫入在其他線程中都可見。 – inf