要模擬出消費者生產者模型,就要先了解他們之間的關係,生活中,我們在買東西時候就是一種生產者消費者模型,供貨商就相當於生產者,而我們就是消費者,商店或者超市,就是一種可以促使我們與供貨商之間進行交易的場所。
總結一下,我們可以簡單的記為「321原則「。
既然我們知道有三種關係,那麼我們就來仔細理一理這三種關係。
清楚他們之間的關係後,我們就通過程式來進行模擬實現了。
#include#include#include#include#include#includetypedef struct node
node,*pnode,**ppnode;
pthread_mutex_t mutex;
pthread_cond_t cond;
pnode buynode(int n)
void listinit(ppnode head)
void pushfront(pnode head,int m)
void poplist(pnode head)
void *runc(void* arg)//消費者
int d = head->next->num;
printf("consumer get data:%d\n",d);
poplist(head);
//pthread_mutex_unlock(&mutex);
sleep(2);
}}void* runp(void* arg)//生產者 }
通過結果我們不難看出他們之間的關係。這裡就不在多說。
接下來我們要看的是環形佇列實現生產者消費者模型,環形佇列與鍊錶不同的一點是如果生產者一直生產而消費者不消費的話,總有滿的時候,一旦佇列滿了的話,生產者就不去消費了,同理,如果沒有資料,消費者也不能去消費。
因此我們不難發現,在這裡我們需要乙個可以實現計數器功能的東西去協助我們進行資料量的和空白佇列的表示,所以我們在這裡就要了解乙個東西,posix訊號量。posix訊號量可以用於程序也可以用於執行緒,由使用者自己選擇。
#include這是它需要引用的標頭檔案。
訊號量初始化函式:
int sem_init(sem_t* sem,int pshared,unsigned int value);
pshared:0表示執行緒間,1表示程序間。
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#includeint arr[6];
pthread_mutex_t lock1;
pthread_mutex_t lock2;
sem_t sem_data;
sem_t sem_blank;
void* runp(void* arg)//生產者
}void* runc(void* arg)//消費者
從結果我們也能證明**的正確性。
基於迴圈鍊錶的約瑟夫問題
pragma once includeusing namespace std templateclass linknode 乙個結構體對外全部可見 linknode const t item,linknode ptr null 資料與指標一同初始化的建構函式,依舊指標域預設引數為空 linknode...
C語言基於鍊錶的佇列
寫了乙個基於鍊錶的佇列,非常簡單,只提供了初始化,判斷是否為空,銷毀,入隊和出隊操作,可以很容易的嵌入到工程中去。只提供了很少的注釋,好的 是可以自注釋的,另外如果對於c語言和佇列這個資料結構較熟悉的話,看懂我的 裡的一些指標操作是很容易的。在最下面提供了乙個測試程式,也可以看成使用指南,queue...
靜態鍊錶和迴圈鍊錶
所謂靜態鍊錶,與指標型描述的鍊錶 動態鍊錶 的區別在於靜態鍊錶借用一維陣列來描述鍊錶.這種儲存型別需要預先分配乙個較大的空間.其結構如下圖 與動態鍊錶操作時最大的區別在於 靜態鍊錶需由使用者自己實現malloc和free函式.為了辨明陣列中哪些分量未被使用,解決的辦法是 將所有未被使用過的以及被刪除...