[問題] race condition只出現在release版本
開發平台(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
12/17 10:37, 1F
→
12/17 10:38, , 2F
12/17 10:38, 2F
推
12/17 11:25, , 3F
12/17 11:25, 3F
→
12/17 11:26, , 4F
12/17 11:26, 4F
推
12/17 12:58, , 5F
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
12/17 18:29, 6F
推
12/17 18:39, , 7F
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
12/17 22:34, 8F
→
12/17 22:35, , 9F
12/17 22:35, 9F
→
12/17 22:36, , 10F
12/17 22:36, 10F
→
12/17 22:36, , 11F
12/17 22:36, 11F
→
12/18 00:16, , 12F
12/18 00:16, 12F
→
12/18 00:16, , 13F
12/18 00:16, 13F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章