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

看板C_and_CPP作者 (寫程式的)時間11年前 (2013/06/18 21:37), 編輯推噓2(208)
留言10則, 3人參與, 最新討論串5/5 (看更多)
※ 引述《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

06/18 22:43, , 1F
可否給個 keyword 方便我查詢 wikipidea, 感謝
06/18 22:43, 1F

06/19 01:43, , 2F
對你每個不懂的字都去 wiki 查吧!這領域不是只看一個字就
06/19 01:43, 2F

06/19 01:44, , 3F
ok的
06/19 01:44, 3F

06/19 01:45, , 4F
2 因為通常沒有用不同步 cache 的 cpu
06/19 01:45, 4F

06/19 01:48, , 5F
我錯了, 2 基本不用考慮 原po的意思應該是 你在os下時
06/19 01:48, 5F

06/19 01:51, , 6F
用編譯器提供的方法 vc: http://ppt.cc/Pheg
06/19 01:51, 6F

06/19 02:01, , 7F
這篇解釋的滿完整的 http://ppt.cc/eZ8Q
06/19 02:01, 7F

06/19 02:06, , 8F
第2個問題就算在 single thread 也有機會發生
06/19 02:06, 8F

06/22 10:03, , 9F
To descent:在wikipidea找memory barrier
06/22 10:03, 9F

06/22 10:05, , 10F
中文的可參考:http://goo.gl/GOAsB
06/22 10:05, 10F
文章代碼(AID): #1Hm6Ag23 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Hm6Ag23 (C_and_CPP)