下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、生产者-消费者问题是一个经典的进程同步问题,已经属于化石级别的了。该问题最早由 Dijkstra提出,用以演示他提出的信号量机制。要求设计在同一个进程地址空间内执行的两个线程。生产者线程生产物品, 然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放出一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区, 那么消费者线程将被阻塞,直到新的物品被生产出来。要求设计并实现一个进程,该进程拥有一个生产者线程和一个消费者线程,它们使用N个不同的缓冲区(N为一个自定义的确定的数
2、值,例如 N=32)。需要使用如下信号量: 一个互斥信号量,用以阻止生产者线程和消费者线程同时操作缓冲区列表; 一个信号量,当生产者线程生产出一个物品时可以用它向消费者线程发出信号;一个信号量,消费者线程释放出一个空缓冲区时可以用它向生产者线程发出信号; 看代码吧:/pv操作:生产者与消费者经典问题/author:leaf#include <stdio . h>#include <stdlib . h>#include <unistd . h>#include <pthread . h>#include <semaphore h>#d
3、efine M 32/* 缓冲数目 */#define P(x) sem_wait (&x)#define V(x) sem_post (&x)int in = 0;/*生广者放置广品的位置*/int out = 0 ;/*消者取广品的位置*/int buff M = 0;/*缓冲初始化为0,开始时没有产品*/sem_t empty_sem/*同步信号里,当两了时阻止生广者放广品 */sem_t full_sem ;/*同步信号量,当没产品时阻止消费者消费*/pthread_mutex_t mutex; /*互斥信号量,一次只有一个线程访问缓冲*/*output the buf
4、fer*/void print ()(int i ;for (i = 0 ; i < M; i +)printf ("%d ", buff i );printf ("n");/*producer*/void * producer ()(for (;)(sleep (1);P (empty_sen);pthread_mutex_lock (&mutex););in = in %M;printf ("(+)produce a product. buffer:"buffin = 1 ;print ();+in ;pthread
5、_mutex_unlock (&mutex);V (full_sem );/*consumer*/void *consumer()for (;)sleep (2);P (full_sem );pthread_mutex_lock (&mutex);out= out %M;printf ("(-)consume a product. buffer:" );buffout = 0 ;print ();+out;pthread_mutex_unlock (&mutex);V (empty_sen); void sem_mutex_init ()(/*sem
6、aphore initialize*/int initl= sem_init (&empty_sem 0 , M);int init2= sem_init (&full_sem , 0, 0);if ( (initl != 0) && (init2 != 0)(printf ("sem init failed n");exit (1);/*mutex initialize*/int init3 = pthread_mutex_init (&mutex, NULL;if (init3 != 0)(printf ("mutex
7、init failed n");exit (1);int main ()pthread_t id1 ;pthread_t id2 ;int i ;int ret ;sem_mutex_init ();/*create the producer thread*/ret = pthread_create (&id1 , NULL producer , NULL;if (ret != 0)printf ("producer creation failed n");exit (1);/*create the consumer thread*/ret = pthre
8、ad_create (&id2 , NULL, consumer, NULL;if (ret != 0)printf ("consumer creation failed n");exit (1);pthread_join (id1 ,NULL;pthread_join (id2 , NULL;exit (0);程序执行结果:|root1 Deal host匚岸 geee-a pv-1 pth r»ad|root1 seal hosteg Jpv(+produce ap roduct.buff«r:l 0 00 0 0 0000000000000
9、0 0 00000000000(+prendu匚* ap roductbuf fvr:l 1 00 0 0 00000000000000 0 00000000000(-Jeonsum? sp roductubuffer:。 1 00 0 0 000000 00000000 0 00000000000(-produce ap roductubuffer:。 1 10 0 0 000000 0* 0000000000000000000(-)con $ urre op rod u ct.buffersO 0 1oooo00000 0000000 0 000000000000(-k)p rod ute
10、 却p rodEt _buff&r:O 0 110 0 00000000000000 0 00000000Q00(4-)p rod ute ap rad u Et Bbufferi-O 0 1110 0OOOOOOOOOOOOD 0 000000000c0(-)ton s urne ap rad u Et BbuffersO 0 0110 000000 O' 0000000 0 00000000000(4-)p rod uce ap rad u Et Bbuffer:0 0 0111000000 O' 0000000 0 00000000000(+)p rod uce
11、ap rad u ct Bbuffer:0 0 0111100000 0* 0000000 0 00000000000(-)con s urre ap rad u ct BbufferrO 0 00 11100000 00000000 0 00000000000(+) p r od u c e ap rad u 匚t: “bu f f b r: 0 0 00 11110000 00000000 0 0000000000Q(+) p rod u ce ap rad u匚七.bu F f e r: 0 0 0Oil:1100000000000 0 0000000000Q(-)can s urre
12、ap rad u 匚t:.bu F f b r: 0 0 00 0 111100000000000 0 00000000000(+) p rod u ce ap rad u ct rbu f f e r: 0 0 00 0 1111100 000000000 0 000000000Q(4) p rod u ce ap r d u e t rbu F f e r: 0 0 00 0 1111110 00000000 0 00000000000(-)LOll S UFTlB 吉p r a d u C t rbu F f 6 r; 0 0 00 0 0 11111000000000000000000
13、ccG(-F)p rod uce ap r n d u C t rbu F f e r:0 Q 00 0 0 1L 1 1 1 100000000000000000c00(Hip rod uce ap rad u Ct rbu Ffer0 00 0 0 11LI111OOOOOODOOO0OOOOO0c0(-)tonsunn& ap rodiict Pbu Ffer:0 0 00 0 0 0I 1 1 1 1 10000000000000000000(-FJproduce ap radud Pbu f f e r; 0 0 00 0 0 0L1111110000000000000000
14、00(+)producs ap roductPbuf ft r:0 0 00 0 0 0III 1 1 1 1 100000000000000000(-)Eonsurre ap rodwetbuffsr:0 0 00 0 0 00 1 1 1 111100000000000000000(+)producfl ap rodwet,buf Rr:Q 0 00 0 0 00 1 1 1 1 1 1 1 10000000000000000(+product ap roduct.byffer:0 0 00 0 0 00 I 1 1 1 I 1 1 1 1 000000000000000(-Jconsuw
15、 fp rcidm匚bi*ffer:0 0 00 0 0 00 0 1 1 1 1 1 1 1 1 000000000000000(+proiduGe opCiduEt Lbuffer:O 0 00 0 0 00 0 1111111 1 1 DDOOOOOOOOO000(Tpr以du匚孕«p rgdmctbuffer:。 0 00 0 0 00 0 1 1 I 1 I 1 1 1 110000000000000(-JconsuHie ap rgductbuffer:0 0 0oooo0 0 0 1 1 1 1 1 1 1 1 i oooooooooo000(d-)p rod uce ap rad u ctbuffer:Q 0 00 0 0 0OOOllllllllllOOOOOOOGOe00(d-)p rod uce ap rad u ct sbuffer
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025云南昭通市红十字会招聘城镇公益性岗位工作人员2人考试核心试题及答案解析
- 2025下半年广东肇庆市怀集县事业单位招聘卫生类岗位5人考试核心试题及答案解析
- 2025年国药控股陕西有限公司招聘备考核心试题附答案解析
- 2025甘肃嘉峪关市第三幼儿园招聘公益性岗位人员2人备考核心题库及答案解析
- 2025年碳中和园区新能源设备采购合同协议
- 2025年碳中和园区低碳交通合同协议
- 2026福建三明建宁县招聘紧缺急需专业教师19人备考核心题库及答案解析
- 阆中市2025年公开考核招聘大学生志愿服务西部计划志愿者服务期满人员考试核心题库及答案解析
- 2025年碳排放权交易代理合同协议
- 2026中国农业科学院第一批统一招聘(农田灌溉研究所11人)考试核心题库及答案解析
- 湘教版七年级生物重点复习提纲全集
- 2025年吉林省直机关公开遴选公务员笔试题参考解析
- 科研项目财务专项审计方案模板
- 退伍留疆考试题库及答案
- 数据伦理保护机制-洞察及研究
- 2025年钢贸行业市场分析现状
- 2025数字孪生与智能算法白皮书
- 乡村医生药品管理培训
- 2025春季学期国开电大专科《管理学基础》一平台在线形考(形考任务一至四)试题及答案
- 财务保密意识培训
- 办公室装修改造工程合同书
评论
0/150
提交评论