Re: [問題] 程式設計的自我修養 Ch.1 疑問

看板C_and_CPP作者 (我要加入劍道社!)時間13年前 (2012/03/04 05:45), 編輯推噓3(301)
留言4則, 4人參與, 最新討論串3/5 (看更多)
※ 引述《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
推l大的解釋:)
03/05 21:47, 4F
文章代碼(AID): #1FKm5nPq (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FKm5nPq (C_and_CPP)