最近實現執行緒池踩了不少坑…記錄如下:
執行緒池建立了兩個執行緒,放兩個任務進去,發現任務沒執行.
例如:
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...
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...