#include#include#includeint gbuffer=0;//全域性變數,緩衝區
handle g_eventbufferempty,g_eventbufferfull;
const int end_produce_number=10;
//生產者執行緒
dword producerthread(pvoid pm)
return 0;
}//消費者執行緒
dword consumerthread(pvoid pm)
return 0;
}int main()
; dword produceid;
dword consumerid;
hthread[0]=::createthread(null,0,(lpthread_start_routine)producerthread,null,0,&produceid);
hthread[1]=::createthread(null,0,(lpthread_start_routine)consumerthread,null,0,&consumerid);
::waitformultipleobjects(2,hthread,true,infinite);
closehandle(hthread[0]);
closehandle(hthread[1]);
closehandle(g_eventbufferempty);
closehandle(g_eventbufferfull);
}
ps:在但緩衝區的環境下,我們只需要兩個互斥變數,乙個用來通知消費者消費geventbufferfull,乙個用於通知生產者生產geventbufferempty,這樣我們就可以實現了,而在多緩衝區的環境下使用互斥變數則有寫捉襟見肘,而是需要使用可以計數的訊號量來進行緩衝區的作用**如下:
//如果有兩個緩衝區多個生產者,多個消費者呢?
#include#include#include#includeusing namespace std;
const int end_produce_number=8;
const int buffer_size=4;
int g_i=0,g_j=0;
int gbuffer[buffer_size]=;
//設定訊號量和關鍵段
critical_section g_cs;
handle g_semphbufferempty=0,g_semphbufferfull=0;
int mm[4]=;
int a=0;
//生產者執行緒
dword produce(pvoid pm)
{ for(int i=1;i<=end_produce_number;i++)
{ ::waitforsingleobject(g_semphbufferempty,infinite);
//互斥訪問的**段
::entercriticalsection(&g_cs);
if(mm[g_i]!=1)
{ gbuffer[g_i]=i;
cout<<"生產者執行緒放入第"<
思路:主要就是最大值是4的訊號量,我們根據這個訊號量進行緩衝區的設定除了4個緩衝區gbuffer[4]以外還有乙個對著4個緩衝區標誌的索引mm[4],如果第i個緩衝區已經被使用那麼mm[i]就為1,如果消費者對第j個緩衝區進行了消費,那麼mm[j]=0;
每次生產者對緩衝區操作的時候需要檢測mm相對應位置上的值是不是0,每次消費者對緩衝區讀取的時候需要檢測mm對應的值是不是1,這樣我們就完成了生產者消費者的執行緒模型
使用阻塞緩衝區的生產者消費者
repository 重點在於repertory類的實現,該類提供阻塞的addproduct和getproduct,來達到生產者與消費者之間的協調。public class repertory catch interruptedexception e else public synchronized...
生產者與消費者模型 有界緩衝區
問題描述 生產者消費者問題 英語 producer consumer problem 也稱有限緩衝問題 英語 bounded buffer problem 是乙個多程序 同步問題的經典案例。該問題描述了共享固定大小緩衝區的兩個程序 即所謂的 生產者 和 消費者 在實際執行時會發生的問題。生產者的主要...
非同步之生產者消費者模型 同步緩衝區的實現
適用於多個生產線程和多個消費執行緒之間的協作,生產者將資訊放入同步緩衝區,消費者從該緩衝區中讀取進行操作,可以指定特殊的 產品 來指示工作執行緒退出。ifndef producer consumer hpp define producer consumer hpp include class non...