生產者與消費者模型 有界緩衝區

2022-09-12 11:33:17 字數 2223 閱讀 4751

問題描述

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多程序

同步問題的經典案例。  該問題描述了共享固定大小緩衝區的兩個程序——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料 放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

要解決該問題,就必須讓生產者在緩衝區滿時休眠(要麼乾脆就放棄資料),等到下次消費者消耗緩衝區中的資料的時候,生產者才能被喚醒,開始往緩衝區新增資料。同樣,也可以讓消費者在緩衝區空時進入休眠,等到生產者往緩衝區新增資料之後,再喚醒消費者。通常採用程序間通訊的方法解決該問題,常用的方法有訊號燈法

等。如果解決方法不夠完善,則容易出現死鎖的情況。出現死鎖時,兩個執行緒都會陷入休眠,等待對方喚醒自己。該問題也能被推廣到多個生產者和消費者的情形。

**要求

semaphore s(8);

s.p();

s.v();

實現臨界區互斥訪問的方法之一  訊號量法

概念上訊號量是表示無力資源數量的實體,它是乙個與佇列有關的整型變數,實現上,訊號量是一種記錄型資料結構,有兩個分量,乙個是訊號量的值,乙個是等待該訊號量的程序佇列的頭指標。

實驗**

1 #include 2 #include 345

using

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...