一組生產者執行緒與一組消費者執行緒通過緩衝區發生聯絡。生產者執行緒將生產的產品送入緩衝區,消費者執行緒則從中取出產品。緩衝區有n 個,是乙個環形的緩衝池。
(1)利用記錄型訊號量機制解決生產者和消費者問題
//利用訊號量機制解決生產者消費者問題
#include#include#include#include#include#define n 20
char buffer[n-1];//緩衝池,大小為n
sem_t empty;//訊號量empty表示緩衝池中空緩衝區的數量
sem_t full;//訊號量full表示緩衝池中空緩衝區的數量
int in;//the index of input
int out;//the index of output
pthread_mutex_t mutux;
void *producer(void *arg)
}void *consumer(void *arg)
}int main(void)
res=sem_init(&empty,0,n);
if(res!=0)
res=sem_init(&full,0,0);
if(res!=0)
res=pthread_create(&pro, null, producer, 0);
if(res!=0)
res=pthread_create(&con, null, consumer, 0);
if(res!=0)
res = pthread_join(pro, null);
if (res != 0)
res = pthread_join(con, null);
if (res != 0)
pthread_mutex_destroy(&mutux);
for(i=0;i<20;i++)
printf("\n");
}
(2)利用管程機制解決生產者消費者問題
//利用管程機制解決生產者消費者問題(注意與訊號量機制解決相關問題的區別)
#include#include#include#include#include#define n 20
int buffer[n];
pthread_cond_t notempty;
pthread_cond_t notfull;
pthread_mutex_t mutex;
int in;
int out;
void put(int x)
buffer[in]=x;
printf("producer buffer[%d]=%d\n",in,buffer[in]);
in=(in+1)%n;
/*pthread_cond_signal函式的作用是傳送乙個訊號給另外乙個正在處於阻塞等待狀態的執行緒,使其脫離阻塞狀態,繼續執行.如果沒有執行緒處在阻塞等待狀態,pthread_cond_signal也會成功返回。*/
pthread_cond_signal(¬empty);
pthread_mutex_unlock(&mutex);
}void get(void)
printf("consumer buffer[%d]=%d\n",out,buffer[out]);
out=(out+1)%n;
pthread_cond_signal(¬full);
pthread_mutex_unlock(&mutex);
}void *producer(void *arg)
void *consumer(void *arg)
void printbuffer(int *buffer)
printf("\n");
}int main(void)
/* 建立生產者和消費者執行緒*/
res=pthread_create(&pro,null,producer,null);
if(res!=0)
res=pthread_create(&con,null,consumer,null);
if(res!=0)
/* 等待兩個執行緒結束*/
pthread_join(pro,null);
pthread_join(con,null);
pthread_mutex_destroy(&mutex);
printbuffer(buffer);
return 0;
}
參見內容以及作業系統教材 生產者消費者問題
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 ...