看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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:用編譯器提供的方法 vc: http://ppt.cc/Pheg 06/19 01:51
damody:這篇解釋的滿完整的 http://ppt.cc/eZ8Q 06/19 02:01
damody:第2個問題就算在 single thread 也有機會發生 06/19 02:06
jenallen:To descent:在wikipidea找memory barrier 06/22 10:03
jenallen:中文的可參考:http://goo.gl/GOAsB 06/22 10:05