能否翻譯一下下面這段出自於《c++ concurrency in action》中關於C++記憶體模型的描述?陳碩2014-08-06 06:52:17

記憶體模型還是《Java Concurrency in Practice》講得比較易懂。

能否翻譯一下下面這段出自於《c++ concurrency in action》中關於C++記憶體模型的描述?haohaolee2014-08-06 07:39:17

不會翻譯,嘗試解釋一下。

對於一個原子變數 x,當一個正確標記的 atomic write (標記是指 acquire release relax等)和一個正確標記的atomic read 同步時,read 只能讀到以下幾種情況下的值:

1。 最開始那個 atomic write 的值

2。 同一執行緒之後的 atomic write 的值

3。 任意執行緒的 atomic modify-write 的值

簡單說,當你去讀一個原子變數時,你要麼讀到初始值,要麼讀到後續的原子寫入,不可能讀到其它莫名其妙的值(這在非原子操作中是有可能出現的)

錯了請指正

能否翻譯一下下面這段出自於《c++ concurrency in action》中關於C++記憶體模型的描述?趙丙峰2014-08-06 10:59:32

要準確理解這個,首先需要看synchronizes-with以及happens-before的定義。對於一般的原子操作,如果他們直接沒有任何上述關係,那麼最佳化器可以方便地把該變數快取到諸如暫存器什麼的地方,只要保證讀取和寫入的原子性(從上層呼叫者看來)即可。這就是relaxed的語義。

如果要建立synchronizes-with關係,必須確保對該原子變數的寫操作對於所有建立有synchronizes-with關係的執行緒都可見。簡單粗暴的做法是強制的讓所有的執行緒(無論有無synchronizes-with關係)都可見,這就是“序列一致”語義。

序列一致簡單是簡單,但是要求太嚴格。因為我們只想在相關的執行緒上保持序列一致即可。要滿足這個條件,一個簡單的辦法是讓相關的執行緒給這個原子變數打標記,告訴編譯器說,注意,針對這個變數的寫操作,必須保證所有的打了標記的執行緒的讀操作都能立即看到。這就是acquire/release語義。

能否翻譯一下下面這段出自於《c++ concurrency in action》中關於C++記憶體模型的描述?知乎使用者2014-08-06 11:30:40

section5。3。1解釋的是synchronizes-with這個概念,我的理解就是解釋兩個CPU操作(單執行緒內或者多執行緒內)在什麼情況下算是“同步”的。

首先要知道程式在編譯、執行過程中可能發生reorde——即指令重排。CPU實際的指令執行順序稱為“memory ordering”。在memory ordering中,有相鄰的兩個操作write x/read x(當然,中間也可以有對其他變數的操作),那麼,read到的x一定是write到的值,這就是“同步”。你要問,這不是很顯然的嗎?請搜尋“CPU快取記憶體一致性”的相關介紹,簡單來說,如果沒有CPU快取一致性,上述兩個操作就可能得不到正確的結果。

記憶體模型均以CPU快取一致性模型為基礎,所以在介紹C++記憶體模型之前,作者先簡要介紹了一下CPU操作的同步這個概念。

大致翻譯:

無論在何種指令重排模式(強一致性、弱一致性)下,程式中(programming order)對x變數的write或者後續對x的寫或者其他執行緒對x的寫,或者把寫改成RMW,在實際的CPU執行順序中(memory order)對x的讀到的值就是剛剛對x的寫入的值。

能否翻譯一下下面這段出自於《c++ concurrency in action》中關於C++記憶體模型的描述?S君2018-07-07 17:57:28

你如果要理解這段話,還是建議先參考一下下面這段話:

Back in section 5。3。1, I mentioned that you could get a synchronizes-with relationship

between a store to an atomic variable and a load of that atomic variable from another

thread, even when there’s a sequence of read-modify-write operations between the

store and the load, provided all the operations are suitably tagged。 Now that I’ve covered the possible memory-ordering “tags,” I can elaborate on this。 If the store is

tagged with memory_order_release, memory_order_acq_rel, or memory_order_

seq_cst, and the load is tagged with memory_order_consume, memory_order_acquire,

or memory_order_seq_cst, and each operation in the chain loads the value written

by the previous operation, then the chain of operations constitutes a release sequence

and the initial store synchronizes-with (for memory_order_acquire or memory_order_

seq_cst) or is dependency-ordered-before (for memory_order_consume) the final

load。 Any atomic read-modify-write operations in the chain can have any memory

ordering (even memory_order_relaxed)。

上面那段話的基本意思是:如果有一個執行緒A對一個atomic物件呼叫了write操作,假設使用的是std::memory_order_release,而執行緒B對這個atomic物件呼叫了read操作,假設使用的是std::memory_order_acquire,那麼即使執行緒A在之前的那個write之後,線上程B的read之前有一個使用std::memory_order_relaxed的寫操作,也不會影響沒有這個write操作建立的同步(synchronize-with)關係,而且執行緒B讀到的是執行緒A第二次write的值。如果期間存線上程對這個atomic物件呼叫讀寫操作,那麼執行緒A的寫操作(使用std::memory_order_release)與執行緒B的讀取操作(使用std::memory_order_acquire)仍然存在同步(synchronize-with)關係,而且中間的讀寫操作讀取的是執行緒A寫的值,執行緒B讀取的是中間讀寫操作寫的值,即使中間讀寫操作使用的std::memory_order_relaxed。當然,寫操作和讀操作不是一定需要用上面說的兩種記憶體序(memory_order),可以選擇其他能夠建立同步(synchronize-with)關係的記憶體序。