執行緒池的坑

2021-08-01 17:34:58 字數 1510 閱讀 6681

最近實現執行緒池踩了不少坑…記錄如下:

執行緒池建立了兩個執行緒,放兩個任務進去,發現任務沒執行.

例如:

void task()

void task2(int i)

int main()

程式執行之後沒有任何列印在終端,但是gdb 和strace都是有輸出的.

一共發現兩個問題最終解決之:

先看執行緒池的實現

threadpool::task threadpool::gettask()

task t;

if(!queue_.empty())//這裡非常重要

//之前我寫的是 if(isstarted_)

return t;

}//這是執行緒執行體

//我們可以看到決定執行緒生命週期的是isstarted_這個變數

//當isstarted_變為false之後執行緒退出,pthread_join返回

void threadpool::runinthread()

}}

這裡解釋了執行緒池的執行邏輯…我們有乙個內部的方法gettask將從佇列中取任務,如果執行緒還沒啟動或者沒有任務,這個函式將阻塞…

//析夠函式

threadpool::~threadpool()

}void threadpool::stop()

for_each(threads_.begin(),

threads_.end(),

boost::bind(&thread::join, _1));

}

一切都看起來那麼的優雅美好,但是卻忽略乙個問題:

如果主線程執行得太快,那麼很有可能工作執行緒還沒有拿到任務,isstarted_就為false了 條件變數也喚醒了,執行緒拿到乙個空任務,什麼都不做就退出了,pthread_join也就返回了,執行緒沒有做任何事情就退出了….

試著發現這一切發生的原因:isstarted_的賦值不是執行緒安全的….但是上面的**明明是用mutexlock進行保護了?

wait呼叫自動釋放鎖,在主線程中add乙個任務,notify執行緒,wait返回又會加上鎖,析夠函式不應該拿到鎖修改臨界區變數…

這個問題在

同樣是執行緒沒執行就退出了,這個比較簡單,發現執行緒還沒有start就被析夠了,簡單的sleep就能解決,不過sleep不能做同步原語,因為最好的解決辦法還是用countdownlatch…

據我了解countdownlatch用法有兩個:

countdownlatch latch(2);

void task()

void task2(int i)

int main()

void task()

void task2(int i)

int main()

記憶體池的坑

今天解決乙個記憶體池的bug,忍不住吐槽兩句。記憶體池的作用主要有兩個 一是減少記憶體反覆申請釋放帶來的耗時以及pagefault,二是讓程式執行耗時更穩定和平滑。所謂的減少記憶體碎片,我覺得主要是針對windows系統考慮的,linux這一點就好多了,一般不用特意去優化。在我的網路通訊框架kons...

python 執行緒池 Python的執行緒池

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

執行緒 執行緒池

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