強行關掉超時的執行緒還是讓它自己退出

2021-05-04 20:48:53 字數 1613 閱讀 9664

在編寫網路傳輸**中有乙個逃不掉的問題就是網路突然斷掉,程式就會像宕機一樣等待在那裡,當然你可以設定超時然後瀟灑的退出。但是當你使用的不是使用

socket

直接編寫,而且你無法設定超時時間,這時你又怎麼辦呢?

當然我們也有辦法,就是開啟乙個執行緒

awaitsingleobject

函式(這裡就已

windows

下的函式為例說明)設定好超時時間,進行等待,到時間主線程就會恢復響應。但是問題來了當超時發生了,主線程可以恢復響應,但剛才開啟的執行緒

a如何處理,放在那裡不管,當然不行。那如何管?直接

terminate

掉執行緒a

?這恐怕是很多人的選擇。隨便在網上查一下也知道,直接

terminate

掉執行緒是不可取的,它的危險性我就不多說了,如果你沒遇到算你走遠。現在我們來看看有沒有好的方法可以讓執行緒從容的自己退出。

讓執行緒自己從容的退出,你肯定會說我是不是傻了,執行緒

a都沒有響應了你能怎麼辦。我當然有我的辦法。請看下面的例子:下面就簡寫主要的函式和變數

cathread : public cwinthread

voidstop();

}cathread::run()

catch()

biffinish = true;

return 0;

}這裡提供了乙個很關鍵的函式,讓我們看看我們如何停到執行緒的吧。

cathread::stop()

對我們沒有別的辦法,我們將進行通訊的通道給關掉。這樣

try…catch

塊就會出現異常。出現了異常執行緒就不會一直等待,會進入異常處理,異常處理完成執行緒就會返回。

哈哈,執行緒現在可以自己退出了,我們實現了我們的目標,到這裡就完了嗎?沒有。讓我們來看看在等待執行緒結束函式裡面我們還有做些什麼。

cathread athread = new cathread ();

athread ->createthread();

dword dw = ::waitforsingleobject(athread->m_hthread,10*1000);

bool frc = false;

switch(dw)

case wait_timeout:

case wait_failed: }

//下面是關鍵點

我們已經呼叫了關閉執行緒的函式,但是執行緒響應異常,進行異常處理也還需要時間,那我們不能就這樣離開主線程不管子執行緒了。我們在子執行緒中設定了乙個變數iffinish 當子執行緒執行到結尾時會將這個變數置為真,這樣我們知道子執行緒中已經沒有我們需要執行和管理的**了,我們可以瀟灑的離開了。如果子執行緒的異常處理還沒有完成則我們就再一次等待該子執行緒,當然這是不會花去太多時間的,因為子執行緒的異常處理工作我們一般也不會安排很多很複雜的邏輯。

這樣我們就利用多執行緒的方式很好的實現了對超時執行緒的安全退出。當然這樣做肯定比不了直接關閉執行緒來的快,但是比起會出現的各種不確定的錯誤,我還是願意選擇安全的做法。

當然你發生超時的情況不同,你也可以選擇不同的方法,變通在你,我這裡只是拋磚引玉希望能給喜歡terminate掉執行緒的朋友一點提示。

執行緒池 超時時間 等待執行緒池中的執行緒完成所有任務

建立乙個固定大小的執行緒池。shutdown 用於關閉啟動執行緒,如果不呼叫該語句,jvm不會關閉。awaittermination 用於等待子執行緒結束,再繼續執行下面的 該例中我設定一直等著子執行緒結束。isterminated當呼叫shutdown 方法後,並且所有提交的任務完成後返回為tru...

多執行緒還是多程序的區別

關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。我們按照多個不同的維度,來看看多執行緒和多程序的對比 注 因為是感性的比較,因此都是相對的...

多執行緒還是多程序的區別

關於多程序和多執行緒,教科書上最經典的一句話是 程序是資源分配的最小單位,執行緒是cpu排程的最小單位 這句話應付考試基本上夠了,但如果在工作中遇到類似的選擇問題,那就沒有這麼簡單了,選的不好,會讓你深受其害。我們按照多個不同的維度,來看看多執行緒和多程序的對比 注 因為是感性的比較,因此都是相對的...