Re: [問題] 程式設計的自我修養 Ch.1 疑問
※ 引述《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
推
03/04 17:05, , 1F
03/04 17:05, 1F
→
03/05 13:55, , 2F
03/05 13:55, 2F
推
03/05 15:43, , 3F
03/05 15:43, 3F
推
03/05 21:47, , 4F
03/05 21:47, 4F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 5 篇):