在主執行緒中慎用WaitForSingleObject (WaitForMultipleObjects)
下面的程式碼我除錯了將近一個星期,你能夠看出什麼地方出了問題嗎?
執行緒函式:
主執行緒中使用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一類函式,而必須使用上述的方案。
相關文章
- Sleep和WaitForSingleObject,WaitForMultipleObjectsAIObjectORM
- 保證執行緒在主執行緒執行執行緒
- 在非主執行緒中建立視窗執行緒
- WaitForSingleObject、WaitForMulitpleObjects和SignalObjectAndWait執行緒同步AIObjectORM執行緒
- 主佇列&主執行緒佇列執行緒
- (MFC)子執行緒的資料如何傳遞給主執行緒中?執行緒
- QT 主執行緒子執行緒互相傳值QT執行緒
- 在netty3.x中存在兩種執行緒:boss執行緒和worker執行緒。Netty執行緒
- Java通過在主迴圈中判斷Boolean來停止執行緒JavaBoolean執行緒
- Control的Invoke和BeginInvoke 是相對於支線執行緒(因為一般在支線執行緒中呼叫,用來更新主執行緒ui)Invoke立即插入主執行緒中執行,而BeginInvoke 要等主執行緒結束才執行執行緒UI
- Java執行緒:執行緒中斷Java執行緒
- Java在不同執行緒中執行程式碼Java執行緒行程
- iOS 在主執行緒操作UI不能保證安全iOS執行緒UI
- 安全函式不安全-多執行緒慎用List.h函式執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- performSelector:withObject:afterDelay: 在子執行緒中呼叫不執行performSelectorObject執行緒
- Java執行緒中斷與終止執行緒執行Java執行緒
- 在單獨執行緒中執行物件成員函式 (轉)執行緒物件函式
- 主執行緒等待所有其他執行緒執行完畢,然後再繼續執行主執行緒的邏輯,有以下幾種方法可以實現:執行緒
- boost中asio網路庫多執行緒併發處理實現,以及asio在多執行緒模型中執行緒的排程情況和執行緒安全。執行緒模型
- C#中的執行緒(三)多執行緒C#執行緒
- 為什麼dispatch_sync在主執行緒會死鎖執行緒
- 主執行緒中也不絕對安全的 UI 操作執行緒UI
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- python多執行緒中:如何關閉執行緒?Python執行緒
- iOS拾遺——為什麼必須在主執行緒操作UIiOS執行緒UI
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- 在Web應用程式中執行計劃任務(多執行緒) (轉)Web執行緒
- 在Linux中,程序和執行緒有何作用?Linux執行緒
- android 主執行緒和子執行緒之間的訊息傳遞Android執行緒
- 執行緒的中斷執行緒
- Java中的執行緒Java執行緒
- 中斷JAVA執行緒Java執行緒
- JVM程式用一個主執行緒來執行main()方法JVM執行緒AI
- MySQL主執行緒、從I/O執行緒和從SQL執行緒的State列常見狀態介紹MySql執行緒
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒