看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《tropical72 (藍影)》之銘言: : : 但馬上又補一句 "可見volatile可以完美的解決第一個問題" : 我看他上下文的意思,不能解決的是和 multi-thread 扯上關係的, : 意思是 thread 開出來後,你不能確定哪一個 thread 會先做、後做, : 甚至不能保證 thread 下一個會切到哪,這和 instr. re-range 意義不同。 其實不是這樣的 書上範例如下: thread 1 thread 2 ----------------------------- x = y = 0; x = y = 0; x = 1; y = 1; r1 = y; r2 = x; 如果這些指令都是按照順序執行 那麼不管這兩支 thread 的先後順序如何 r1 和 r2 必定不可能同時為 0 因為 若 r1 = y 的結果為 0,表示 thread 2 中的 y = 1 尚未執行 而 x = 1 已經執行,所以 r2 = x 的結果為 1,反之亦然 但這樣的假設是錯誤的,即使對 x、y、r1、r2 加上 volatile 也無法保證 r1 與 r2 不會同時為 0 上述的程式碼轉為組合語言後的結果大致如下 (假設使用了 volatile): thread 1 thread 2 ------------------------------ mov x, 0 mov x, 0 mov y, 0 mov y, 0 mov x, 1 mov y, 1 mov eax, y mov eax, x mov r1, eax mov r2, eax 現代的 CPU 具有一項重要的特性:out-of-order execution 為了盡可能地運用 CPU 內部的多個運算單元 它會主動分析指令之間的相依性 在不影響最終結果的條件下動態地改變指令的執行順序 我在 thread 1 中使用顏色標示了具有相依性的指令 相同顏色的指令必需照順序執行 但不同顏色的指令其執行順序是會被重新排列的 也就是說以下是另一種可能的執行順序: mov y, 0 mov eax, y mov r1, eax mov x, 0 mov x, 1 這中間的過程發生在 CPU 內部,compiler 無從干預 因此無法保證前面的 r1、r2 不同時為 0 這和 thread 的執行先後順序無關就是了 : : 3. 他在書上p.27 也提到兩個東西 一個是 Read-Write-Lock 和 Condition Variable. : 這點你有興趣的話,還是去看本 multi-thread 之類的書或好一點的教學文, : 我沒力再講。 OS 課本上有 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.168.77.128
tropical72:感謝指正 ^^ 03/04 17:05
angleevil:這個版真的很多高手 03/05 13:55
Arton0306:推! 03/05 15:43
VictorTom:推l大的解釋:) 03/05 21:47