日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者

發(fā)布時間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

問題描述:

一組生產(chǎn)者進(jìn)程和一組消費者進(jìn)程共享一個初始為空、大小為 n 的緩沖區(qū),只

有緩沖區(qū)沒滿時,生產(chǎn)者才能把消息放入到緩沖區(qū),否則必須等待;只有緩沖區(qū)

不空時,消費者才能從中取出消息,否則必須等待。由于緩沖區(qū)是臨界資源,它

只允許一個生產(chǎn)者放入消息,或者一個消費者從中取出消息。

分析:

關(guān)系分析:生產(chǎn)者和消費者對緩沖區(qū)互斥訪問是互斥關(guān)系,同時生產(chǎn)者和

消費者又是一個相互協(xié)作的關(guān)系,只有生產(chǎn)者生產(chǎn)之后,消費者才能消費,

它們也是同步關(guān)系。

整理思路:這里比較簡單,只有生產(chǎn)者和消費者兩個進(jìn)程,且這兩個進(jìn)程

存在著互斥關(guān)系和同步關(guān)系。那么需要解決的是互斥和同步的 PV 操作的

位置。3. 信號量設(shè)置:信號量 mutex 作為互斥信號量,用于控制互斥訪問緩沖池,

初值為 1;信號量 full 用于記錄當(dāng)前緩沖池中“滿”緩沖區(qū)數(shù),初值為 0;

信號量 empty 用于記錄當(dāng)前緩沖池中“空”緩沖區(qū)數(shù),初值為 n。

代碼如下:

還是有點缺陷

如果編譯失敗,要額外加參數(shù):-lpthread,例如:gcc -o p2 p2.c -lpthread

#include

#include

#include

#include

typedef int semaphore;

typedef int item;

#define Num 10

#define producerNum 10

#define consumerNum 10

item buffer[Num]={0};

int in=0, out=0;

int nextp=0, nextc=0;

semaphore mutex=1, empty=Num, full=0;

void *producer(void *a){

do {

/* code */

while (empty <= 0) {

/* code */

//printf("緩沖區(qū)已滿\n");

}

empty--;

while(mutex <= 0);

mutex--;

nextp++;

printf("Producer--生產(chǎn)一個產(chǎn)品ID%d, 緩沖區(qū)位置為%d\n",nextp,in );

buffer[in]=nextp;

in=(in+1)%Num;

//proCount--;

mutex++;

full++;

sleep(100);

}while(1);

}

void *consumer(void *b){

do {

/* code */

while (full<=0) {

/* code */

//printf("緩沖區(qū)為空\n");

}

full--;

while(mutex <= 0 );

mutex--;

nextc=buffer[out];

printf("\t\t\tConsumer--消費一個產(chǎn)品ID%d, 緩沖區(qū)位置為%d\n",nextc,out );

out=(out+1)%Num;

mutex++;

empty++;

sleep(100);

} while(1);

}

int main(int argc, char const *argv[]) {

/* code */

//設(shè)置線程池

int all=producerNum+consumerNum;

pthread_t threadPool[all];

//生產(chǎn)者進(jìn)程添加進(jìn)入線程池

int i;

for(i=0; i < producerNum; i++){

pthread_t temp1;

if(pthread_create(&temp1,NULL,producer,NULL) == -1){

/* code */

printf("ERROR, fail to create producer%d\n", i);

exit(1);

}

threadPool[i]=temp1;

}

//消費者進(jìn)程添加進(jìn)入線程池

for(i=0; i < producerNum; i++){

pthread_t temp2;

if(pthread_create(&temp2,NULL,consumer,NULL) == -1){

/* code */

printf("ERROR, fail to create consumer%d\n", i);

exit(1);

}

threadPool[i+producerNum]=temp2;

}

//啟動線程池

void *result;

for(i=0; i

if (pthread_join(threadPool[i],&result) == -1) {

/* code */

printf("ERROR\n");

exit(1);

}

}

return 0;

}

總結(jié)

以上是生活随笔為你收集整理的进程同步生产者-消费者问题C语言,经典进程同步问题 --- 生产者和消费者的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。