看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) win7 64bit + code::blocks 12.11 + mingw gcc 4.7.1 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) winapi 問題(Question): 前陣子原PO寫了一個單執行緒黑白棋AI,一直覺得可惜沒辦法把原PO的4核CPU完全利用 最近想把它改成多執行緒版本,不過原PO對寫多執行緒沒有太多的經驗 所以改了好一陣子,終於寫出不會crash的版本 在debug模式下運作良好,CPU的4個核心有都在做事 但是後來把程式換到release模式去編譯卻出現race condition的情況 Orz 例子: Options->Experimental->Multi-Core Support->可選要使用的核心數 Options->Benchmark 跑測試,最後盤面結果應該要是白子46黑子18 debug版本: https://dl.dropboxusercontent.com/u/27449435/ReversiDebug.rar 無論選擇多少核心數,debug版本的測試結果都是一致的 release版本: https://dl.dropboxusercontent.com/u/27449435/ReversiRelease.rar release版本的每次測試結果可能會變,尤其是選用4核心時 試很久還是不知道是哪裡引起race condition的 ˊ ˋ code因為在到處亂試,所以有點亂 先感謝各位大大的建議 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.174.235.40 ※ 編輯: BombCat 來自: 1.174.220.59 (12/17 05:03)
wuliou:前陣子也有碰到這問題 後來發現是我critical section 12/17 10:37
wuliou:沒有處理好 有一些區段在執行比較慢的debug下不會出錯 12/17 10:38
cashlalala:multithread 測到會錯的話其他版本沒有錯都只是剛好而 12/17 11:25
cashlalala:以,跟debug或release沒關係 12/17 11:26
fuha:你可以檢查 WaitForSingleObject return value 12/17 12:58
感謝大大們的建議 我後來檢查 WaitForSingleObject的return value有些會是0xFFFFFFFF 用GetLastError()看錯誤代碼有6跟87,查MSDN說 6 : The handle is invalid. 87 : The parameter is incorrect. 代表的是說我的thread handler不正確 or thread沒有正確產生? 附上檢查錯誤號碼的版本code: http://0rz.tw/a2zqR 奇怪的是,Debug模式下編譯出來的程式不會有上述錯誤產生 這些錯誤只在release模式下編譯出來的程式才會發生 ※ 編輯: BombCat 來自: 1.174.235.40 (12/17 18:26)
descent:你能找出 Debug 和 release 有哪些地方不同嗎 12/17 18:29
kwpn:在可疑的地方加sleep, 看release是不是就變得較不會當 12/17 18:39
我覺得有可能是這段說的原因 http://ideone.com/hLSyn1 原文: http://msdn.microsoft.com/zh-tw/library/kdzttdcb%28v=vs.90%29.aspx 如同wuliou大說的debug版本跑比較慢,所以避掉這個 看起來應該不是race condition,而是WINAPI的使用問題 ※ 編輯: BombCat 來自: 1.174.235.40 (12/17 19:14)
MetalChao:以前的經驗, release 跟 debug 其中一種差別在於, 沒給 12/17 22:34
MetalChao:初始值的global或static變數, debug會被清成0, release 12/17 22:35
MetalChao:則不會; 你可以看看你的程式有沒有假設某變數預設為0卻 12/17 22:36
MetalChao:沒給初始值的 12/17 22:36
azureblaze:global和static一定會被清成0 12/18 00:16
azureblaze:會有差的是local和class member 12/18 00:16