作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 程式設計的自我修養 Ch.1 疑問
時間Sun Mar 4 13:45:18 2012
※ 引述《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