windows多執行緒(十) 生產者與消費者問題

2022-02-22 08:10:02 字數 2281 閱讀 3835

生產者消費者問題是乙個著名的執行緒同步問題,該問題描述如下:有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個具有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,顯然生產者和消費者之間必須保持同步,即不允許消費者到乙個空的緩衝區中取產品,也不允許生產者向乙個已經放入產品的緩衝區中再次投放產品。

要滿足生產者與消費者關係,我們需要保證以下兩點:

**實現如下:

//生產者消費者問題,乙個生產者,乙個消費者,乙個緩衝區。

#include #include using namespace std;

dword winapi producerthread(lpvoid);

dword winapi consumerthread(lpvoid);

const int product_num = 10; //總共生產10個產品

int g_buffer = 0; //緩衝區

critical_section g_csvar; //互斥鎖

handle g_heventbufempty, g_heventbuffull;

int main()

dword winapi producerthread(lpvoid p)

return 0;

}dword winapi consumerthread(lpvoid p)

return 0;

}

執行結果如下,生產者等待緩衝區為空的時候才向緩衝區投放產品,消費者等待緩衝區滿的時候才取走產品。

相比於乙個生產者,乙個消費者,乙個緩衝區,生產者由乙個變成多個不難處理,多開執行緒就可以,需要注意的是緩衝區的變化,可以利用兩個訊號量就可以解決這種緩衝池有多個緩衝區的情況。用乙個訊號量a來記錄為空的緩衝區個數,另乙個訊號量b記錄非空的緩衝區個數,然後生產者等待訊號量a,消費者等待訊號量b就可以了。

**實現如下:

// 乙個生產者,兩個消費者,乙個緩衝池(四個緩衝區)

#include #include using namespace std;

dword winapi producerthread(lpvoid);

dword winapi consumerthread(lpvoid); // 兩個消費者,開兩個執行緒就行了

const int product_num = 16; //產品總數

const int buffer_size = 4; //緩衝區大小

int g_buffer[buffer_size];

critical_section g_csvar; // 互斥鎖

handle g_heventbufempty, g_heventbuffull;

int g_i = 0, g_j = 0;

int main()

{ initializecriticalsection(&g_csvar);

g_heventbufempty = createsemaphore(null, 4, 4, null); //記錄空緩衝區個數訊號量

g_heventbuffull = createsemaphore(null, 0, 4, null); //記錄滿緩衝區個數訊號量

const int thread_num = 3; //執行緒數

handle handle[thread_num];

memset(g_buffer, 0, sizeof(g_buffer)); //緩衝池清零

handle[0] = createthread(null, 0, producerthread, null, 0, null); //生產者執行緒

handle[1] = createthread(null, 0, consumerthread, null, 0, null); //消費者執行緒1

handle[2] = createthread(null, 0, consumerthread, null, 0, null); //消費者執行緒2

waitformultipleobjects(thread_num, handle, true, infinite);

for (int i = 0; i執行結果如下所示:

windows多執行緒(十) 生產者與消費者問題

生產者消費者問題是乙個著名的執行緒同步問題,該問題描述如下 有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個具有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,顯然生產者和消費者之間必須保持...

多執行緒通訊(二)生產者 消費者模式

生產者 消費者模式其原理是基於wait notify實現的。通過 更能便於理解,廢話不多說,上 生成者和消費者一對一模式 生產者public class producer public void buildproduct 生產產品並通知消費者 thread.sleep 1000 system.out...

Java多執行緒14 生產者 消費者模型

什麼是生產者 消費者模型 一種重要的模型,基於等待 通知機制。生產者 消費者模型描述的是有一塊緩衝區作為倉庫,生產者可將產品放入倉庫,消費者可以從倉庫中取出產品,生產者 消費者模型關注的是以下幾個點 生產者 模型作為一種重要的模型,它的優點在於 利用wait notify 實現生產者 消費者模型 既...