操作系统生产者和消费者问题_第1页
操作系统生产者和消费者问题_第2页
操作系统生产者和消费者问题_第3页
操作系统生产者和消费者问题_第4页
操作系统生产者和消费者问题_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论