問題描述
生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多程序
同步問題的經典案例。 該問題描述了共享固定大小緩衝區的兩個程序——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料 放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。
要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。通常採用程序間通訊的方法解決該問題,常用的方法有訊號燈法
等。如果解決方法不夠完善,則容易出現死鎖的情況。出現死鎖時,兩個執行緒都會陷入休眠,等待對方喚醒自己。該問題也能被推廣到多個生產者和消費者的情形。
**要求
semaphore s(8);
s.p();
s.v();
實現臨界區互斥訪問的方法之一 訊號量法
概念上訊號量是表示無力資源數量的實體,它是乙個與佇列有關的整型變數,實現上,訊號量是一種記錄型資料結構,有兩個分量,乙個是訊號量的值,乙個是等待該訊號量的程序佇列的頭指標。
實驗**
1 #include 2 #include 345using
namespace
std;67
8class
semaphore
15 ~semaphore()
18void p()
2122
void v()
2526
};27
2829
class
buffer
45 ~buffer(){}
4647
bool put(int
x)48
54 cells[tail] =x;
55 tail = (tail + 1) %size;
56 num++;
57mutex_tail.v();
58semaphore_full_cell.v();
59return
true;60
}6162bool
get(int&x)
6369 x =cells[head];
70 head = (head + 1) %size;
71 num--;
72mutex.v();
73semaphore_empty_cell.v();
74return
true;75
}76};77
7879 buffer a; //
a快取區
80 buffer b; //
b快取區
8182
83 dword winapi producer(lpvoid) //
生產者執行緒
8490}91
return0;
92}9394
95 dword winapi consumer(lpvoid) //
消費者執行緒
96103
}104
return0;
105}
106107
108 dword winapi midder(lpvoid) //
即是生產者也是消費者執行緒
109116
bool ok =b.put(i);
117if (!ok)
120121
}122
return0;
123}
124125
126int
main()
127
生產者消費者多緩衝區實現
include include includeint gbuffer 0 全域性變數,緩衝區 handle g eventbufferempty,g eventbufferfull const int end produce number 10 生產者執行緒 dword producerthread...
使用阻塞緩衝區的生產者消費者
repository 重點在於repertory類的實現,該類提供阻塞的addproduct和getproduct,來達到生產者與消費者之間的協調。public class repertory catch interruptedexception e else public synchronized...
非同步之生產者消費者模型 同步緩衝區的實現
適用於多個生產線程和多個消費執行緒之間的協作,生產者將資訊放入同步緩衝區,消費者從該緩衝區中讀取進行操作,可以指定特殊的 產品 來指示工作執行緒退出。ifndef producer consumer hpp define producer consumer hpp include class non...