pv
操作是由
p操作原語和
v操作原語組成的,對訊號量進行操作,具體定義如下: p
(s):
(1)申請資源,將訊號量的值減1,
s=s-1。
(2)如果s>=0
,則該程序繼續執行,否則程序置為等待狀態,排入等待佇列。 v
(s):
(1)釋放資源,將訊號量
s的值加1,
s=s+1。
(2)如果s>0
,則該程序繼續執行,否則釋放佇列中第乙個等待訊號量的程序。
利用pv
操作能夠實現程序的兩種情況,同步和互斥。生產者和消費者問題可以分為三種情況來分析。
(1)
乙個生產者,乙個消費者,公用乙個緩衝區。 定義
兩個同步訊號量:
empty
:表示緩衝區是否為空,初值為1。
full
:表示緩衝區是否為滿,初值為0。
生產者程序:
while(true)
消費者程序:
while(true)
(2)
乙個生產者,乙個消費者,公用
n個環形緩衝區。
定義兩個同步訊號量:
empty
:表示緩衝區是否為空,初值為n。
full
:表示緩衝區是否為滿,初值為0。
定義緩衝區的編號為0到
n-1。定義兩個指標
in,out
。分別是生產者程序和消
費者程序使用的指標,指向下乙個可用的緩衝區。
生產者程序:
while(true)
消費者程序:
while(true)
(3)
一組生產者,一組消費者,公用
n個環形緩衝區。
此時生產者和消費者之間存在同步關係,各個生產者,各個消費者之間存在互斥關係。
定義兩個同步訊號量,兩個互斥訊號量:
empty
:表示緩衝區是否為空,初值為n。
full
:表示緩衝區是否為滿,初值為0。
mutex1
:生產者之間的互斥訊號量,初值為1。
mutex2
:消費者之間的互斥訊號量,初值為1。
定義緩衝區的編號為0到
n-1。定義兩個指標
in,out
。分別是生產者程序和消
費者程序使用的指標,指向下乙個可用的緩衝區。
生產者程序:
while(true)
消費者程序:
while(true)
#include
#include
const unsigned short size_of_buffer = 10; //
緩衝區長度
unsigned short productid = 0; //
產品號unsigned short consumeid = 0; //
將被消耗的產品號
unsigned short in = 0; //
產品進緩衝區時的緩衝區下標
unsigned short out = 0; //
產品出緩衝區時的緩衝區下標
int g_buffer[size_of_buffer]; //
緩衝區是個迴圈佇列
bool g_continue = true; //
控制程式結束
handle g_hmutex; //
用於執行緒間的互斥
handle g_hfullsemaphore; //
當緩衝區滿時迫使生產者等待
handle g_hemptysemaphore; //
當緩衝區空時迫使消費者等待
dword winapi producer(lpvoid); //
生產者執行緒
dword winapi consumer(lpvoid); //
消費者執行緒
int main()}
return 0;}
//生產乙個產品。簡單模擬了一下,僅輸出新產品的id號
void produce() //
把新生產的產品放入緩衝區 //
輸出緩衝區當前的狀態
for (int i=0;i
生產";
if (i==out) std::cout << " <--
消費";
std::cout << std::endl;}}
//從緩衝區中取出乙個產品
void take()}
//消耗乙個產品
void consume() //
生產者
//消費者
dword winapi consumer(lpvoid lppara)
return 0;}
有乙個需要特別注意的地方:如果生產者和消費者使用同乙個互斥訊號量。那麼要注意同步訊號量與互斥訊號量的申請與釋放順序。如果某時緩衝區為空,某個消費者鎖上
mutex
,然後等待
p(full)
,此時生產者會在
p(mutex)
時阻塞,導致死鎖的發生。
生產者消費者問題
public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...
生產者 消費者問題
在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...
生產者 消費者問題
1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...