小議避免程序退出時的死鎖

2021-06-05 23:48:56 字數 1407 閱讀 4327

——windows gui程式中使用執行緒的心得體會

①避免在工作者執行緒中使用sendmessage,改用postmessage比較好。

原因是這樣的,以乙個普通程式退出為例,我們經常會使用以下方式構建退出邏輯:

主線程正在訊息處理函式

工作者執行緒正在處理任務

void ondestroy()

void dowork();

while(wait_object_0 != waitforsingleobject(m_hstop, 0))

closehandle(m_hthread);}

如上所示,只要主線程開始處理wm_destroy訊息後,只有等到ondestroy返回,主線程才會處理下乙個windows訊息。一旦ondestroy函式開始執行且還沒有返回,dowork中發出的wm_gettext訊息就不會被主線程處理,使用sendmessage後工作者執行緒就會等待主線程處理wm_gettext進入休眠,注意這種休眠無法使用resumethread喚醒(即使喚醒只要主線程沒有處理wm_gettext訊息也會繼續睡過去)。而這時ondestroy函式正在用waitforsingleobject等待dowork檢測m_hstop訊號退出執行緒,所以兩者互相等待都進入了休眠,這樣就產生了死鎖。

很多朋友一定會說,那就把ondestroy裡waitforsingleobject去掉直接往後執行不就沒有死鎖了麼?死鎖是沒有了,由於ondestroy函式的主要職責就是負責釋放資源,接下來它一定會呼叫類似cwnd::ondestroy()函式來銷毀視窗資源,這樣一來dowork裡就很有可能因為訪問介面資源而崩潰。

所以,②應該避免在工作者執行緒中直接訪問介面資源,包括不要使用getwindowstext等函式。可以把要顯示到介面上的資料,放進乙個自己構建的佇列中,然後使用postmessage發出特定的訊息或者使用者自定義的訊息,由訊息處理函式去完成。

下面是我在工作者執行緒裡直接訪問介面資源的方法,利用訊息幫浦:

工作者執行緒正在處理任務

void dowork();

msg smsg=;

while(wait_object_0 != waitforsingleobject(m_hstop, 0))

//盡快訪問介面資源,這裡還是有可能死鎖的,最好不要在這中間插入指令。

sendmessage(m_hmainwnd, wm_gettext, sizeof(strtile) , strtitle);

//debugpoint;

sleep(0);

}//退出執行緒前釋放相應資源:

closehandle(m_hthread);}

上面也許不是解決退出死鎖的萬能方法,只是我的一點心得,希望大家有更好的辦法也貼上來。

避免殭屍程序

下面通過 為了觀察,完成同樣的功能,體會三種程序等待方式的區別。三種等待方式 1.wait waitpid 忽略sigchild訊號 忽略sigchild訊號只在linux下有效 2.wait只能進行阻塞等待,waitpid既可以用於阻塞等待,也可以用於非阻塞等待 waitpid 當waitpid的...

執行緒 程序的區別之小議 二

關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。經常在網路上看到有的xdjm問 多程序好還是多執行緒好?linux下用多程序還是多執行緒?...

10點告訴你做神秘顧客如何避免進店被識別

進店雖然是一定要從正門進入,不要太正規,盡量隨意一些,大方一些,比如,走路快一點,不要看銷售顧問人員,直接去車輛旁邊的意思,如果有2個人一起,盡量2個人有說有笑有溝通。一定要把自己當成是個客戶,真正想買車的客戶,根據自己的興趣和疑問和銷售顧問正常溝通就可以了,重要的是搞 哪個真正的客戶不想優惠呢,搞...