[問題] race condition只出現在release版本

看板C_and_CPP (C/C++)作者 (炸彈貓)時間12年前 (2013/12/17 03:14), 編輯推噓5(508)
留言13則, 7人參與, 最新討論串1/1
開發平台(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)

12/17 10:37, , 1F
前陣子也有碰到這問題 後來發現是我critical section
12/17 10:37, 1F

12/17 10:38, , 2F
沒有處理好 有一些區段在執行比較慢的debug下不會出錯
12/17 10:38, 2F

12/17 11:25, , 3F
multithread 測到會錯的話其他版本沒有錯都只是剛好而
12/17 11:25, 3F

12/17 11:26, , 4F
以,跟debug或release沒關係
12/17 11:26, 4F

12/17 12:58, , 5F
你可以檢查 WaitForSingleObject return value
12/17 12:58, 5F
感謝大大們的建議 我後來檢查 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)

12/17 18:29, , 6F
你能找出 Debug 和 release 有哪些地方不同嗎
12/17 18:29, 6F

12/17 18:39, , 7F
在可疑的地方加sleep, 看release是不是就變得較不會當
12/17 18:39, 7F
我覺得有可能是這段說的原因 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)

12/17 22:34, , 8F
以前的經驗, release 跟 debug 其中一種差別在於, 沒給
12/17 22:34, 8F

12/17 22:35, , 9F
初始值的global或static變數, debug會被清成0, release
12/17 22:35, 9F

12/17 22:36, , 10F
則不會; 你可以看看你的程式有沒有假設某變數預設為0卻
12/17 22:36, 10F

12/17 22:36, , 11F
沒給初始值的
12/17 22:36, 11F

12/18 00:16, , 12F
global和static一定會被清成0
12/18 00:16, 12F

12/18 00:16, , 13F
會有差的是local和class member
12/18 00:16, 13F
文章代碼(AID): #1Ihr4I2X (C_and_CPP)
文章代碼(AID): #1Ihr4I2X (C_and_CPP)