看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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 階段有使用過。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.239.51
pcedison:多謝Descent大大分享指教 06/17 15:43