今天我們來寫乙個基於固定大小的環形佇列的生產者消費者模型。
首先來畫圖說明一下
這是乙個環形佇列的生產者消費者模型。生產者用p表示,消費者用c表示。這個環形佇列的每一段空間我們用semblank表示,放入的內容我們用semdata表示。生產者首先要申請乙個semblank,然後放入semdata。消費者則是要先拿乙個semdata,然後釋放乙個semblank。在這個環形佇列中我們要考慮幾種情況
1、一開始生產者與消費者在同一起跑線,但是我們必須要讓生產者先操作,因為只有生產者生產了資料,消費者才可以去拿資料。如果生產者還沒有生產資料就讓消費者去拿資料,那麼就會拿到一些非法資料。所以在執行過程中我們一定要保持生產者在消費者的前面。
2、當生產者已經跑完了一圈,每個semblank上都有資料,而消費者沒有拿資料,這是生產者和消費者再次重合的時候,就要讓消費者先操作,因為如果讓生產者繼續操作的話又一輪生產的資料將會覆蓋到之前的資料。即生產者不能將消費者套圈。
所以我們引入了兩個訊號量去解決這個問題,當生產者要生產資料的時候要先去申請乙個semblank,相當於p操作,申請成功後我們要放入乙個資料,就相當於v操作。而對於消費者來說,首先要拿乙個資料,相當於p操作,拿到乙個資料後要釋放乙個semblank,就相當於v操作。我們的semblank是從n到0的,而semdata是從0到n的。
下面我們來介紹posix訊號量。
posix訊號量和system v訊號量作用相同,都是用於同步操作,達到無衝突的訪問共享資源目的。但posix可以用於執行緒間同步。
#include //初始化訊號量
int sem_init(sem_t *sem,int pshared,unsigned
int value)
//引數:
// pshared:0表示執行緒間共享,非零表示程序間共享
// value:訊號量初始值
int sem_destroy(sem_t *sem); //銷毀訊號量
int sem_wait(sem_t *sem); //等待訊號量
//功能:等待訊號量,會將訊號量的值減1
int sem_post(sem_t *sem) //發布訊號量
//功能:發布訊號量,表示資源使用完畢,可以歸還資源了。將訊號量值加1.
現在我們來用**來實現固定大小的環形佇列的生產者消費者模型。
#include
#include
#include
#include
#include
#include
#include
#include
#define err_exit(m) \
do \
while(0)
#define consumers_count 1
#define producers_count 1
#define buffsize 10
int g_buffer [buffsize];
unsigned
short in = 0;
unsigned
short out = 0;
unsigned
short produce_id = 0;
unsigned
short consume_id = 0;
sem_t g_sem_full;
sem_t g_sem_empty;
pthread_mutex_t g_mutex;
pthread_t g_thread[consumers_count+producers_count];
void* cousume(void *arg)
{ int i;
int num = *(int*)arg;
free(arg);
while(1)
{printf("%d wait buffer not empty\n",num);
sem_wait(&g_sem_empty);
pthread_mutex_lock(&g_mutex);
for(i=0;iprintf("%2d",i);
if(g_buffer[i] == -1)
printf("%s","null");
else
printf("%d",g_buffer[i]);
if(i == out)
printf("\t
POSIX下的訊號量(生產者 消費者模型)
system v下的訊號量主要用於程序間通訊,也可以用於執行緒 不推薦 posix下的訊號量主要用於執行緒間通訊,也可以用於程序 不推薦 本篇主要研究posix下的訊號量 訊號量變數的型別為sem t。主要介面 訊號量的建立 int sem init sem t sem,int pshared,un...
Windows 用訊號量實現生產者 消費者模型
執行緒併發的生產者 消費者模型 1.兩個程序對同乙個記憶體資源進行操作,乙個是生產者,乙個是消費者。2.生產者往共享記憶體資源填充資料,如果區域滿,則等待消費者消費資料。3.消費者從共享記憶體資源取資料,如果區域空,則等待生產者填充資料。4.生產者的填充資料行為和消費者的消費資料行為不可在同一時間發...
生產者消費者模型 基於Posix訊號量和互斥量
這種方式可以用訊號量初值來定義倉庫大小,迴圈生產和消費 生產者 while 1 消費者 while 1 實現 include include include include include define pro count 3 define com count 3 define bufsize 5 ...