能否翻譯一下下面這段出自於《c concurrency in action》中關於C 記憶體模型的描述?

時間 2021-06-01 03:40:14

1樓:

理解這個問題就要理解cpu的工作原理,我們直覺上cpu是一句一句指令執行的,但實際上不是這樣。

會改變指令執行順序有這麼幾種情況:

編譯器改變語句順序,這個是最好理解的,包括NRO優化;

多工系統偷跑,比如說你剛剛看到語句一執行,但實際上系統把語句打成微指令,並行執行了語句一到語句十的指令,恰好語句一的計算結果已全部結束,你就看到了語句一,但語句二到語句十已經在計算了,而且也開始寫快取了。

branch分支處理,你在巨集觀上看到乙個if else 或者switch,雖然告訴你if如果執行了,else不執行,但一般多核CPU還是會在空閒的CPU上執行else,switch同理

多級快取導致查詢時效錯誤,這個和relaxed關係很大,執行緒A的某個結果被換頁到一級快取,執行緒B剛好在計算他,但慢了半步,其實A在邏輯上應晚於B,但執行緒C進來的時候剛好看到執行緒B在操作它,因為設的relaxed,所以不管怎樣就給取走了值。

2樓:

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的寫入的值。

3樓:趙丙峰

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

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

這就是acquire/release語義。

4樓:haohaolee

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

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

1. 最開始那個 atomic write 的值2. 同一執行緒之後的 atomic write 的值3.

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

錯了請指正

有沒有人能解釋一下下面這個等式?

一童天下 應該是srednicki的吧 其實就是把哈密頓中的對應項改成算符提前,你可以把前面有算符的指數展開,列出幾項歸納一下看看,求導之後的東西再用反向泰勒展開縮在一起就成了積分號裡面的指數項e的H1次方什麼的 引理一 證明 注意到根據變分的定義,掉換變分與路徑積分的順序即可。引理二 證明 同上。...

想請教一下下面這句話是什麼意思?感謝?

樂樂 看個人對快樂的定義是什麼,真正的快樂不都是發自內心,很簡單的麼,這句話意思可能也就是不需要去跟任何乙個要思考任何利弊才能維持友誼的人去裝朋友關係,但是每個人都可以成為朋友,快樂的人會吸引朋友,你所說的是一般情況 愛狗人士 小盧 這句話就相當於你找到了乙個真真正正的 友誼這種友誼不摻和任何一點與...

詢問一下下面交通事故是誰的責任

洛陽娃娃 這樣的情況,應該是這樣的。A和B不知道是什麼樣的事故,暫且不說,這個事故有點繞口,咱們分開來說。從B車開始來說,B車發生事故是靜止狀態,那麼C車撞上B車,說明車輛沒有保持安全距離,甚至說,沒有盡到提前預判,那麼造成事故的B車因為靜止,C車撞上,這屬於追尾事故,從我預估C車付主要責任,B車是...