muduo網路庫學習筆記 5 執行緒池的實現

2021-07-16 15:54:24 字數 2328 閱讀 5602

生產者-消費者問題也被稱為有界緩衝區問題,兩個程序/執行緒共享乙個公共的固定大小的緩衝區。其中乙個是生產者,將資訊放入緩衝區;另乙個是消費者,從緩衝區中取出資訊。

問題在於當緩衝區已滿,而此時生產者還想向其中放入乙個新的資料項的情況。其解決方法就是讓生產者休眠,待消費者從緩衝區中取出乙個或多個資料項時再喚醒它。同樣地,當消費者試圖從緩衝區中取資料而發現緩衝區為空時,消費者就休眠,直到生產者向其中放入一些資料時再將其喚醒。

// 以下**只是對生產者-消費者問題的大致描述

// 因為對count的訪問未加限制,可能會出現競爭條件問題

#define n 100 // 緩衝區的槽數目

intcount = 0; // 緩衝區中的資料項的數目

// 生產者

void producer(void)

}// 消費者

void consumer(void)

}

外部執行緒可以向執行緒池中的任務佇列新增任務,相當於「生產者」;一旦任務佇列中有任務,就喚醒執行緒佇列中的執行緒來執行這些任務,這些執行緒就相當於「消費者」。模型如下圖。

muduo threadpool類圖:

(1)任務佇列的實現用到了stl的deque容器

deque容器為乙個給定型別的元素進行線性處理,像向量一樣,它能夠快速地隨機訪問任乙個元素,並且能夠高效地插入和刪除容器的尾部元素。但它又與vector不同,deque支援高效插入和刪除容器的頭部元素,因此也叫做雙端佇列。

deque常用函式如下:

#include 

void push_front(const t& x); // 雙端佇列頭部增加乙個元素x

void push_back(const t& x); // 雙端佇列尾部增加乙個元素x

void pop_front(); // 刪除雙端佇列中最前乙個元素

void pop_back(); // 刪除雙端佇列中最後乙個元素

void clear(); // 清空雙端佇列中最後乙個元素

reference at(int pos); // 返回pos位置元素的引用

reference front(); // 返回手元素的引用

reference back(); // 返回尾元素的引用

bool empty() const; // 向量是否為空,若為true,則向量中無元素

(2)幾個成員函式的說明

檔名:threadpool.cc

// 啟動執行緒池,啟動的執行緒是固定個數的(numthreads)

void threadpool::start(int numthreads)

}

檔名:threadpool.cc

// 關閉執行緒池

void threadpool::stop()

// 等待所有執行緒關閉

// boost::bind呼叫類成員函式時需要傳入類成員函式指標、類物件指標...

for_each(threads_.begin(),

threads_.end(),

boost::bind(&muduo::thread::join, _1));

}

檔名:threadpool.cc

// 執行任務

void threadpool::run(const task& task)

// 如果執行緒池有執行緒,則將任務新增到任務佇列

else

}

檔名:threadpool.cc

// 任務分配函式(獲取任務)

// 執行緒池函式或者執行緒池裡面的函式都可以到這裡取出乙個任務

// 然後在自己的執行緒中執行任務,返回乙個任務指標

threadpool::task threadpool::take()

task task;

if(!queue_.empty())

return

task;

}

muduo庫學習筆記 執行緒安全

muduo規定的必須在io執行緒完成的操作 連線的更新 連線的讀寫 連線的關閉 連線的析構等 tcpserver start 將acceptor listen置於所屬執行緒?一直不理解為什麼這裡需要將listen放到其所屬執行緒中 因為listen的描述符一定是在io執行緒中的 可能原因是其他從re...

linux多執行緒網路庫 muduo庫學習

什麼是muduo庫 muduo 是基於 reactor 模式 執行緒安全的 支援多核多執行緒的簡單易用的網路庫。符合現代c 程式設計規範 大量使用boost的開源網路庫。為什麼學習muduo庫 muduo庫對學習linux下面向過程c 程式設計 多執行緒程式設計 boost庫應用實踐,有非常大的幫助...

muduo網路庫學習筆記 7 執行緒特定資料

1 了解執行緒特定資料 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問。posix執行緒庫通過維護一...