muduo網路庫學習之BlockinngQueue類、ThreadPool 類、Singleton類封裝中的知識點
一、BlockinngQueue<T>類、BoundedBlockingQueue<T>類
生產者消費者問題,可以用訊號量+互斥鎖 或者 條件變數+互斥鎖 來解決,還分為有界和無界緩衝區兩種情形,如下圖:
有界緩衝區:
生產者:
訊號量+互斥鎖: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
無界緩衝區:使用條件變數+互斥鎖實現,put()可以看作是生產者,take()可以看作實現消費者,內部的實現就是上述4個步驟的集合。
template<typename T>
class BoundedBlockingQueue : boost::noncopyable
class BoundedBlockingQueue : boost::noncopyable
有界緩衝區:與無界緩衝區多了一個條件變數notFull成員,並且使用boost庫的環形緩衝區。
二、ThreadPool類(固定執行緒數,不考慮執行緒數動態增減)
執行緒池本質上也是生產者消費者問題:
生產者執行緒向任務佇列新增任務,消費者執行緒(線上程佇列中)從任務佇列取出任務去執行。
class ThreadPool : boost::noncopyable
typedef boost::function<void ()> Task;
程式碼中有這麼一段:
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
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網路庫學習之MutexLock類、MutexLockGuard類、Condition類、CountDownLatch類封裝中的知識點MutexCountDownLatch封裝
- muduo網路庫學習之Timestamp類、AtomicIntegerT 類封裝中的知識點封裝
- muduo網路庫學習之ThreadLocal 類、ThreadLocalSingleton類封裝知識點thread封裝
- muduo網路庫學習之Logger類、LogStream類、LogFile類封裝中的知識點封裝
- muduo網路庫學習之Exception類、Thread 類封裝中的知識點(重點講pthread_atfork())Exceptionthread封裝
- muduo網路庫學習筆記(8):高效日誌類的封裝筆記封裝
- muduo網路庫學習之muduo_http 庫涉及到的類HTTP
- muduo網路庫學習之EventLoop(四):EventLoopThread 類、EventLoopThreadPool 類OOPthread
- muduo網路庫學習之muduo_inspect 庫涉及到的類
- muduo網路庫學習筆記(1):Timestamp類筆記
- muduo網路庫學習筆記(3):Thread類筆記thread
- muduo網路庫Timestamp類
- muduo網路庫Exception異常類Exception
- 13封裝網路請求類庫封裝
- muduo網路庫學習筆記(12):TcpServer和TcpConnection類筆記TCPServer
- muduo網路庫AtomicIntegerT原子整數類
- muduo網路庫學習之EventLoop(一):事件迴圈類圖簡介和muduo 定時器TimeQueueOOP事件定時器
- muduo網路庫學習筆記(6):單例類(執行緒安全的)筆記單例執行緒
- Laravel 小知識點之 HtmlString 類LaravelHTML
- Java中類的一些知識點Java
- java學習 -- 利用類的反射和泛型自己動手寫jdbc封裝小類庫Java反射泛型JDBC封裝
- JavaSE基礎知識學習-----Object類JavaObject
- java學習之Date類、DateFormat類JavaORM
- 封裝xunsearch類封裝
- JS 封裝類JS封裝
- java學習之基本包裝類Java
- Java學習--Java 中的包裝類Java
- VR垃圾分類體驗系統:學習垃圾分類知識科普VR
- 【入門知識】網路安全中的漏洞分為哪幾類?
- C++中類相關知識點總結C++
- muduo網路庫學習之EventLoop(七):TcpClient、ConnectorOOPTCPclient
- Android之Activity基類封裝Android封裝
- 物件與類_知識點筆記物件筆記
- Stella 知識庫--模型類的設計模型
- JavaSE基礎知識學習—–抽象類和介面Java抽象
- JavaSE基礎知識學習-----抽象類和介面Java抽象
- php的curl封裝類PHP封裝
- Retrofit+okhttp+Rxjava封裝網路請求工具類HTTPRxJava封裝