執行緒池問題本質上也是生產者-消費者問題,生產者向任務佇列中新增任務,執行緒佇列中的執行緒從任務佇列中取出任務執行。
task函式是要執行的任務;
threads_是執行緒佇列,是乙個ptr_vector,內部存放執行緒指標;
queue_是任務佇列;
start函式用來啟動執行緒池(建立固定個數的執行緒);
run函式用來往執行緒池中的任務佇列新增任務;
runinthread函式是執行緒池中的執行緒要執行的函式(顯然每個執行緒要重複執行任務,所以函式中肯定有while迴圈);
take函式:執行緒池中的執行緒函式要去任務佇列中獲取任務;
threadpool.h
#ifndef muduo_base_threadpool_h
#define muduo_base_threadpool_h
#include
#include
#include
#include
#include
#include
#include
#include
namespace muduo;}
#endif
threadpool.cc
#include
#include
#include
#include
#include
using
namespace muduo;
threadpool::
threadpool
(const string& name)
:mutex_()
,cond_
(mutex_)
,name_
(name)
,running_
(false
)threadpool::
~threadpool()
}void threadpool::
start
(int numthreads)
}void threadpool::
stop()
for_each
(threads_.
begin()
, threads_.
end(),
boost::
bind
(&muduo::thread::join, _1));
}void threadpool::
run(
const task& task)
else
}threadpool::task threadpool::
take()
task task;if(
!queue_.
empty()
)return task;
}void threadpool::
runinthread()
}}catch
(const exception& ex)
catch
(const std::exception& ex)
catch(.
..)}
主線程負責往任務佇列中新增任務,建立乙個含有5個子執行緒的執行緒池處理任務。
threadpool_test.cc
#include
#include
#include
#include
#include
void
print()
void
printstring
(const std::string& str)
intmain()
muduo::countdownlatch latch(1
);pool.
run(boost::
bind
(&muduo::countdownlatch::countdown,
&latch));
//類的成員函式作為任務
sigslot庫原始碼分析
言歸正傳,sigslot是乙個用標準c 語法實現的訊號與槽機制的函式庫,型別和執行緒安全。提到訊號與槽機制,恐怕最容易想到的就是大名鼎鼎的qt所支援的物件之間通訊的模式吧。不過這裡的訊號與槽雖然在概念上等價與qt所實現的訊號與槽,但是採用的僅僅是標準c 語法,不像qt採用了擴充套件c 語言的方式 q...
boost 原始碼 ref 庫分析
引用檔案 boost ref.hpp 一般情況下,泛型演算法中的函式物件,傳值語義是可行的,但是也有很多特殊情況,作為引數的函式物件拷貝代價過高 具有複雜的內部狀態 或者不希望拷貝物件 內部狀態不應該被改變 甚至拷貝是不可行的 noncopyable,單件 boost.ref應用 模式,引入物件引用...
spring原始碼分析 spring原始碼分析
1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...