DJ2-5 生产者-消费者问题
创始人
2025-06-01 02:11:51
0

生产者与消费者是一个广义的概念,可以代表一类具有相同属性的进程。

生产者和消费者进程共享一个大小固定的缓冲区,其中,一个或多个生产者生产数据,并将生产的数据存入缓冲区,并有一个消费者从缓冲区中取数据。

假设缓冲区的大小为n(存储单元的个数),它可以被生产者和消费者循环使用

分别设置两个指针in和out,指向生产者将存放数据的存储单元和消费者将取数据的存储单元,如图

生产者-消费者执行流程图

1. 利用记录型信号量解决生产者-消费者问题

变量定义、所需函数及主程序如下:

typedef struct {int value;struct process_control_block * list;
} semaphore;int in = 0;
int out = 0;
semaphore mutex, empty, full;    
mutex->value = 1;       //由于缓冲池是一种临界资源,因此使用互斥型信号量
empty->value = n;       //代表空缓冲区的数量,最初存储单元均为空
full->value = 0;        //代表满缓冲区的数量,最初存储单元均为空void producer();        //生产者进程
void consumer();        //消费者进程void main() {cobegin     //并发执行producer(); consumer();coend
}

wait() 和 signal() 描述如下:

wait(semaphore * S) {S->value--;if(S->value < 0) block(S->list);//S->value == 0时代表刚好取走最后一个资源
}signal(semaphore * S) {S->value++;if(S->value <= 0) wakeup(S->list);//S->value == 0时代表刚好还有一个进程被阻塞
}

 生产者进程如下:

void producer() {do {//produce an item in nextpwait(&empty);    //判断是否有空存储单元wait(&mutex);    //判断是否可用缓冲池buffer[in] = nextp;in = (in + 1) % n;signal(&mutex);  //唤醒一个使用者signal(&full);   //唤醒一个消费者} while(true);
}

消费者进程如下:

void producer() {do {wait(&full);     //判断是否有空存储单元wait(&mutex);    //判断是否可用缓冲池nextc = buffer[out];out = (out + 1) % n;signal(&mutex);  //唤醒一个使用者signal(&empty);  //唤醒一个消费者//consume the item in nextc} while(true);
}

1)wait(&mutex) 必须放在 wait(&full) 后面,避免抢占到了缓冲池的使用权,结果发现没有空存储单元可用,从而导致资源浪费。

2)mutex 是互斥型信号量,因此对其的 wait 和 signal 操作必须成对出现。

3)进程一旦被阻塞,不管这个时间片是否用完,都立即进入下一个时间片。

plus. 举例说明

t1t2t3t4t5t6t7t8t9
runningc1: wait(full)

p1: item->nextp

p1: wait(empty)

p1: wait(mutex)

p2: item->nextp

p2: wait(empty)

p2: wait(mutex)

p3: item->nextp

p3: wait(empty)

p1: CS

p1: signal(mutex)

p1: signal(full)

finish

p2: CS

p2: signal(mutex)

p2: signal(full)

finish

c1: wait(mutex)

c1: CS

c1: signal(mutex)

c1: signal(empty)

finish

p3: wait(mutex)

p3: CS

p3: signal(mutex)

p3: signal(full)

finish

full->value0-1=-1(<0?)-1+1=0(<=0?)0+1=1(<=0?)1+1=2(<=0?)
full->list{c1}wakeup(full->list){}{}
empty->value2-1=1(<0?)1-1=0(<0?)0-1=-1(<0?)-1+1=0(<=0?)
empty->list{}{}{p3}wakeup(empty->list)
mutex->value1-1=0(<0?)0-1=-1(<0?)-1+1=0(<=0?)0+1=1(<=0?)1-1=0(<0?)0+1=1(<0?)

1-1=0(<0?)

0+1=0(<=0?)

mutex->list{}{p2}wakeup(mutex->list){}{}{}{}
ready{p1, p2, p3}{p2, p3, p1}{p3, p1}{p1}{p2, c1}{c1}{}{p3}{}

 

 

 

 

相关内容

热门资讯

蔬菜中的“维 C 之王”竟是它... 在蔬菜界中,甜椒以其鲜艳的色彩和清脆的口感,常常被当作菜肴的点缀。无论是青红黄相间的炒菜,还是沙拉中...
文化中国行丨快来围观!中国古代... 本文转自【央视新闻客户端】; 除了划龙舟,包粽子也是端午节传承千年的经典习俗,承载着深厚的文化底蕴。...
重庆朝天门码头,轿夫抬游客上岸... 朝天门,位于中国重庆渝中半岛嘉陵江与长江交汇处,重庆以前的十七座古城门之一,属于沿江九门中的一座。现...
原创 刷... 端午撞上六一的初夏,阳光把日子酿得滚烫,而武安的山水里藏着能让时光慢下来的魔法——刷到这条推送的你,...
详细攻略:从长沙出发自驾游黄山... 自驾游无疑是探索中国美丽风景的一种绝佳方式,而黄山,作为中国最著名的山脉之一,以其雄伟的山势、奇特的...
西北青甘大环线必玩景点,甘南省... 当辽阔的戈壁在窗外铺展,当圣洁的雪山在云端闪耀,当五彩的经幡在风中翻飞,我知道,我的灵魂正在被西北的...
端午节不止安康,还有法门文化景... 端午小长假第三天,法门文化景区气候宜人,游览体验度满分。景区各岗位员工坚守岗位,不辞辛劳,不仅传递节...
原创 生... 标题:生煎包,馅料的秘密,皮薄馅大有汤汁,一口下去汤汁儿直流! 在这个快节奏的时代,美食不仅仅是味...
“粤”上新台阶丨水果千千万 广... 谁都知道荔枝是“岭南佳果”。但在广东,如果你还只是把荔枝当成一种普通水果,那可就大大低估了广东人对它...
原创 我... 我家做芹菜炒蘑菇这菜,从来不放肉,一把芹菜,再配上些鲜蘑菇,清清淡淡但又营养满满,而且特别下饭。炒这...
吕文扬与元诚的新疆游记:天山徒... 飞机降落在乌鲁木齐地窝堡国际机场时,吕文扬透过舷窗看到了远处连绵的雪山轮廓。他拍了拍身旁正在打瞌睡的...
四川6天旅游路线推荐:四川报团... 四川6天旅游路线推荐:四川报团旅游6天费用,超实用干货分享!超棒攻略 四川之旅,一场味蕾与心灵的盛宴...
海口火山荔枝王采摘攻略来了!3... 🌞🌞🌞 湛蓝湛蓝的天空 大朵大朵的云彩 海口的夏天 空气里满是荔枝香甜~ 黝黑火山石上孕育的海口火...
假期余额不足,这些地方依然有惊... 传统 过端午,迎世运,游公园城市 “五月五,是端阳,门插艾,香满堂。”当端午的艾香浸润天府新区的街巷...
和朋友去张家界5日旅游跟团报价... 最近刚计划了一次张家界的五天四晚旅行,想着既能放松心情又能看看大自然的鬼斧神工。张家界旅游五天四晚旅...
机票价格“跳水” 突现1.1折... 近期,机票价格处于“跳水季”。记者在多家在线旅游平台上看到,目前从杭州萧山国际机场出发前往三亚、成都...