執行緒池的陷阱

2022-03-26 14:19:31 字數 884 閱讀 9824

使用執行緒池要小心,一不小心就會導致程式掛死。舉例說明這種情況。

執行緒池中有乙個同步佇列存放資料,多個執行緒取佇列中的資料去處理,資料的型別可能有多個,所以每種資料型別對應乙個處理函式,假設某種資料的處理函式會把執行緒阻死,這時就悲劇了,這個阻死會蔓延到執行緒池的所有執行緒,最後執行緒池中所有的執行緒都掛死了,程式也掛死了。因為執行緒池的執行緒是不停的切換去處理資料的,凡是遇到會掛死執行緒的資料時,執行緒會乙個個死掉,直到所有的執行緒掛死。

解決辦法是:

一、乙個型別的資料乙個執行緒或者多個型別的資料乙個執行緒,這樣某個型別的資料處理導致執行緒掛死,其它執行緒還能正常執行,不會導致程式掛死。

二、執行緒池中加超時處理,超時處理就不會掛死執行緒。

使用執行緒池一定要保證執行緒處理函式不會掛死,否則整個程式都會掛死了。執行緒池內部的執行緒函式需要加超時處理,乙個簡單的處理方法是通過乙個臨時執行緒去控制該函式是否超時。原來的處理邏輯

while (m_running)

}改成帶超時的處理邏輯

while (m_running)

}改成帶超時的處理邏輯

while (m_running)

{task task;

m_queue.take(task);

if (task)

{boost::thread thd(task);

if(thd.timed_join(boost::posix_time::seconds(5)))

{   cout<<"沒有超時"<

超時處理時要把導致執行緒函式掛死的資源釋放,比如關閉socket或者關閉資料庫,讓掛死的執行緒能退出。

注意:這裡只是乙個程式的容錯保證,並不解決根本問題,解決根本問題還是要把導致執行緒卡死的函式的bug解決。

python 執行緒池 Python的執行緒池

usr bin env python coding utf 8 concurrent 用於執行緒池和程序池程式設計而且更加容易,在python3.2中才有。import sys from concurrent.futures import threadpoolexecutor,as complete...

執行緒 執行緒池

執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...

執行緒 執行緒池

乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...