muduo base庫原始碼分析(七)

2021-10-21 17:44:41 字數 2460 閱讀 4047

執行緒池問題本質上也是生產者-消費者問題,生產者向任務佇列中新增任務,執行緒佇列中的執行緒從任務佇列中取出任務執行。

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...