生產者-消費者問題也被稱為有界緩衝區問題,兩個程序/執行緒共享乙個公共的固定大小的緩衝區。其中乙個是生產者,將資訊放入緩衝區;另乙個是消費者,從緩衝區中取出資訊。
問題在於當緩衝區已滿,而此時生產者還想向其中放入乙個新的資料項的情況。其解決方法就是讓生產者休眠,待消費者從緩衝區中取出乙個或多個資料項時再喚醒它。同樣地,當消費者試圖從緩衝區中取資料而發現緩衝區為空時,消費者就休眠,直到生產者向其中放入一些資料時再將其喚醒。
// 以下**只是對生產者-消費者問題的大致描述
// 因為對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執行緒庫通過維護一...