作者jenallen (寫程式的)
看板C_and_CPP
標題Re: [問題] 程式設計的自我修養 Ch.1 疑問
時間Tue Jun 18 21:37:44 2013
※ 引述《descent (「雄辯是銀,沉默是金」)》之銘言:
: ※ 引述《QQ29 (我愛阿蓉)》之銘言:
: : 大家好
: : 經過版友推薦 開始看程式設計師的自我修養
: : 目前只看完第一章 等於是在複習OS...
: : 我有一些疑問
: : 想提出來討論
: : 2. 他在書上p28頁 有舉出最佳化的問題
: : 但29頁那邊 他提到加上volatile 可以做到兩件事情
: : 但馬上又補一句 "可見volatile可以完美的解決第一個問題"
: : 讓我不知道他在講啥了, 看到後面....他也沒提出解法
: : 反倒是提出 有些寫法看似沒問題卻是有淺在風險.....但還是沒講怎麼解...
: : 主要的問題在
: : 如果我們無法阻止編譯對指令做重排
: : 那該怎麼辦
: : 我寫的程式碼問題百出阿 = =
: : 他提30頁提到的barrier 說真的我從沒看過跟用過....
: : 這是硬體support的嗎?
: : 若沒support不就是沒有救了....
: : 再多執行緒的情況下 程式怎麼才能夠寫的完美....
: : 這邊看得很迷糊 想請了解的版友提供一些想法
: 我也被這問題困惑很久, 在 os 下寫應用程式, 幾乎沒用過這種指令,
: 有需要在 os 下的應用程式使用這些指令嗎?
: 還是被 os api 給包裝起來了呢?
: 這是 linux 在 x86 下使用的 memory barrier 指令。
: #define mb() asm volatile("mfence":::"memory")
: #define rmb() asm volatile("lfence":::"memory")
: #define wmb() asm volatile("sfence" ::: "memory")
: Binary Hacks--駭客秘傳技巧一百招 #94 在談這個,
: 看完就清楚了。
: 不過這樣的話, 在 os 下寫應用程式也會遇到這問題才是,
: 可是卻沒看過在 os 下的 c 應用程式用上這種指令。
: multi-thread 程式要突破兩關:
: 1. lock 機制 (使用 test-and-set 硬體指令實作)
: 2. memory ordering (使用 memory barrier 指令)
: 才有對的結果。
: 1 通常由 os api 提供 (x86 可用 bts 實作)。
: 2 我就沒看過在 os 下的應用程式要怎麼用, 只看過在 driver 階段有使用過。
通常在應用層,只有多緒程式在同步的API實作部份需要考慮這問題,並且已經被c runtime包裝過了,可以參考wikipidea上的解說
--
Sent from my Android
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 119.194.41.53
推 descent:可否給個 keyword 方便我查詢 wikipidea, 感謝 06/18 22:43
推 damody:對你每個不懂的字都去 wiki 查吧!這領域不是只看一個字就 06/19 01:43
→ damody:ok的 06/19 01:44
→ damody:2 因為通常沒有用不同步 cache 的 cpu 06/19 01:45
→ damody:我錯了, 2 基本不用考慮 原po的意思應該是 你在os下時 06/19 01:48
→ damody:第2個問題就算在 single thread 也有機會發生 06/19 02:06
→ jenallen:To descent:在wikipidea找memory barrier 06/22 10:03