在主執行緒中慎用WaitForSingleObject (WaitForMultipleObjects)

鄧學彬發表於2011-04-02

下面的程式碼我除錯了將近一個星期,你能夠看出什麼地方出了問題嗎?
執行緒函式:

主執行緒中使用CreateThread啟動執行緒。

當想終止子執行緒時,在主執行緒中:
bTerminate = TRUE;
WaitForSingleObject(threadHandle, INFINITE);
可是,以執行到WaitForSingleObject,子執行緒就Crash了。

為什麼呢?

問題原因:
後來我終於在InsertItem的反彙編中發現瞭如下的程式碼
call dword ptr [__imp__SendMessageA@16 (7C141B54h)]
可見,InsertItem是必須藉助訊息迴圈來完成任務的。如果我們在主執行緒中WaitForSingleObject了,必然導致主執行緒阻塞,也就導致了訊息迴圈的阻塞,最終導致工作執行緒Crash掉了*_*

解決方案:
為了解決在主執行緒中Wait的問題,微軟專門設計了一個函式MsgWaitForMultipleObjects,這個函式即可以等待訊號(thread,event,mutex等等),也可以等待訊息(MSG)。即不論有訊號被激發或者有訊息到來,此函式都可以返回。呵呵,那麼我的解決辦法也就出來了。
將上面的WaitForSingleObject用下面的程式碼替換:


總結:
如果在工作執行緒中有可能涉及到了訊息驅動的API,那麼不能在主執行緒中使用WaitForSingleObject一類函式,而必須使用上述的方案。

相關文章