muduo網路庫學習之BlockinngQueue類、ThreadPool 類、Singleton類封裝中的知識點
一、BlockinngQueue<T>類、BoundedBlockingQueue<T>類
生產者消費者問題,可以用訊號量+互斥鎖 或者 條件變數+互斥鎖 來解決,還分為有界和無界緩衝區兩種情形,如下圖:
![](https://i.iter01.com/images/d43c834c9fee4a90298e6203e7b9213138f5873d0ae8e07cdbd88b61d026e811.jpg)
有界緩衝區:
生產者:
訊號量+互斥鎖:1,2,3,4,5
條件變數+互斥鎖:2,1,3,5,4(外框)
消費者:
訊號量+互斥鎖:1,2,3,4,5
條件變數+互斥鎖:2,1,3,5,4(外框)
無界緩衝區:
生產者:
訊號量+互斥鎖:2,3,4,5
條件變數+互斥鎖:2,3,5,4(外框)
消費者:
訊號量+互斥鎖:1,2,3,4
條件變數+互斥鎖:2,1,3,4(外框)
template<typename T>
class BlockingQueue : boost::noncopyable
class BlockingQueue : boost::noncopyable
![](https://i.iter01.com/images/87138bd222144275dbf570de7150b2c3fe9c6669a8e0eff4cf9c85bb1db063b7.png)
無界緩衝區:使用條件變數+互斥鎖實現,put()可以看作是生產者,take()可以看作實現消費者,內部的實現就是上述4個步驟的集合。
template<typename T>
class BoundedBlockingQueue : boost::noncopyable
class BoundedBlockingQueue : boost::noncopyable
![](https://i.iter01.com/images/4e8a02a76ea1fee4dda6ac058c97537f069b6b06e577fd03db9b3ccebc9e5497.png)
有界緩衝區:與無界緩衝區多了一個條件變數notFull成員,並且使用boost庫的環形緩衝區。
二、ThreadPool類(固定執行緒數,不考慮執行緒數動態增減)
執行緒池本質上也是生產者消費者問題:
生產者執行緒向任務佇列新增任務,消費者執行緒(線上程佇列中)從任務佇列取出任務去執行。
![](https://i.iter01.com/images/234f28c18b12c01368edee9d1b9135a51258ea78e1c04c45ff67c495e199832e.jpg)
class ThreadPool : boost::noncopyable
typedef boost::function<void ()> Task;
![](https://i.iter01.com/images/91c9e10a99bedc73edd377478674ebf1dfde69a82035d513f7f6baa27532c811.png)
程式碼中有這麼一段:
C++ Code
1
2 3 |
threads_.push_back(new muduo::Thread(
boost::bind(&ThreadPool::runInThread, this), name_ + id)); threads_[i].start(); |
初看有點奇怪,其實是因為ptr_vector<T>過載了[], 即 T& operator[]( size_type n );
三、singleton類
template<typename T>
class Singleton : boost::noncopyable
class Singleton : boost::noncopyable
![](https://i.iter01.com/images/5dba78d1d885a0f62a42e0b714ec9bb7bf1caffcbb05068d3648c47fa917e933.png)
1、pthread_once
pthread_once(&ponce_, &Singleton::init);
保證init函式只被呼叫一次,即只初始化一個物件。在init內部 value_ = new T();
2、atexit
::atexit(destroy);
在init 函式內註冊destroy,在程式結束時會呼叫destroy,在destroy內部delete value_;
3、typedef char T_must_be_complete_type[sizeof(T) == 0 ? -1 : 1];
假設class A; A* p; delete p; 現在A只是前向宣告,是不完全型別,那麼delete p會出問題,但在編譯時只是報警告。
sizeof(A) == 0; 故 typedef char T_must[-1]; 在編譯時就會出錯。
參考:
muduo manual.pdf
《linux 多執行緒伺服器程式設計:使用muduo c++網路庫》
相關文章
- muduo網路庫Timestamp類
- muduo網路庫Exception異常類Exception
- muduo網路庫AtomicIntegerT原子整數類
- 靜態庫封裝之ComStr類封裝
- 靜態庫封裝之ComFile類封裝
- 靜態庫封裝之ComDir類封裝
- Laravel 小知識點之 HtmlString 類LaravelHTML
- Android之Activity基類封裝Android封裝
- 【入門知識】網路安全中的漏洞分為哪幾類?
- VR垃圾分類體驗系統:學習垃圾分類知識科普VR
- 一、類的封裝性封裝
- Retrofit+okhttp+Rxjava封裝網路請求工具類HTTPRxJava封裝
- educoder上的實訓題目(學習-Java包裝類之Byte類)Java
- muduo網路庫編譯安裝編譯
- 封裝Date工具類封裝
- 封裝Redis工具類封裝Redis
- JavaSE基礎知識學習—–抽象類和介面Java抽象
- 十五、類與封裝的概念封裝
- Java類和物件知識點總結Java物件
- muduo原始碼解析11-logger類原始碼
- c#封裝DBHelper類C#封裝
- 4、類和物件—封裝物件封裝
- 自用驗證類封裝封裝
- 通過Handler封裝的網路請求資料的工具類NetUtils封裝
- 好程式設計師Java學習路線分享Java案例-封裝JDBC工具類程式設計師Java封裝JDBC
- 如何講清楚 Java 物件導向的問題與知識?(類與物件,封裝,繼承,多型,介面,內部類...)Java物件封裝繼承多型
- C/C++ Zlib庫封裝MyZip壓縮類C++封裝
- 使用C++/CLI呼叫C#封裝類庫C++C#封裝
- 網路安全學習中,原始碼審計有哪些分類?原始碼
- 類載入、物件例項化知識點一網打盡物件
- c# Lambda操作類封裝C#封裝
- JAVA類庫之——Character類(持續更新)Java
- java學習:Java中的其它類Java
- Python 學習筆記之類「物件導向,超類,抽象」Python筆記物件抽象
- C#學習——基本類——Math類C#
- 【Django drf】檢視類APIView之五層封裝 ApiView的類屬性 drf配置檔案DjangoAPIView封裝
- 學習javaScript必知必會(6)~類、類的定義、prototype 原型、json物件JavaScript原型JSON物件
- 抽象類特點 學習筆記抽象筆記
- Android常用工具類的封裝Android封裝