典型的进程间通信IPC问题-生产者消费者问题_第1页
典型的进程间通信IPC问题-生产者消费者问题_第2页
典型的进程间通信IPC问题-生产者消费者问题_第3页
全文预览已结束

下载本文档

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

文档简介

典型的进程间通信IPC问题-⽣产者消费者问题本实例详细解释了⽣产者消费者问题的简易模型,对于同步互斥以及多线程处理此问题提出了⼀个较好的解决⽅案。#include<stdio.h>#include<pthread.h>#defineMAX10000000000//定义缓冲区数量,就是⽣产品数量pthread_mutex_tthe_mutex;pthread_cond_tcondc,condp;intbuffer=0;void*product(void*ptr){inti;for(i=1;i<MAX;++i){pthread_mutex_lock(&the_mutex);//互斥使⽤缓冲区while(buffer!=0)pthread_cond_wait(&condp,&the_mutex);buffer=i;//数据放⼊缓冲区pthread_cond_signal(&condc);//唤醒消费者pthread_mutex_unlock(&the_mutex);//释放缓冲区}pthread_exit;}void*consumer(void*ptr){inti;for(i=1;i<MAX;++i){pthread_mutex_lock(&the_mutex);//互斥加锁while(buffer==0)pthread_cond_wait(&condc,&the_mutex);buffer=0;pthread_cond_signal(&condp);//唤醒唤醒⽣产者pthread_mutex_unlock(&the_mutex);}pthread_exit(0);}intmain(intargc,char**argv){pthread_tpro,con;pthread_mutex_init(&the_mutex,0);pthread_cond_init(&condp,0);pthread_cond_init(&condc,0);pthread_create(&con,0,consumer,0);pthread_create(&pro,0,product,0);pthread_join(pro,0);pthread_join(con,0);pthread_cond_destroy(&condc);pthread_cond_destroy(&condp);pthread_mutex_destroy(&the_mutex);}在main函数⾥⾯包含了线程处理问题时的基本操作,包含线程创建,互斥量声明,线程注册的基本API函数。本实例最多可参考《Unix环境⾼级编程》第⼗⼆章线程控制。但是,有⼀点,这样的模型有极⼤地可能会发⽣死锁现象。死锁造成的四个条件是形成互斥条件。每个资源要么已经分配了⼀个进程,要么就是可⽤的。占有和等待条件。已经得到了某个资源的进程可以请求新的资源。不可抢占条件,就是已经分配给⼀个进程的资源不能强制被抢占,他只能被占有他的进程显⽰主动的释放,环路等待条件,就是死锁发⽣时,系统⼀定有⼀个或两个以上的进程组成的⼀个环路,在循环等待资源。但是却没有释放资源。死锁发⽣是,四个条件肯定都满⾜。如果任何⼀条件不成⽴,那么也就不会发⽣死锁。死锁如何避免呢?同样有四种⽅式-忽略该问题,如果你忽略他,那么他也会忽略你,⾮著名鸵鸟算法。然⽽,这种想法也就是想想、-检测死锁并恢复,检测死锁是否发⽣,⼀旦发⽣,采取措施补救,亡⽺补牢。-仔细对资源进⾏分配,动态避免死锁。-破坏死锁的四个必要条件,任意⼀个条件不满⾜那么,死锁就不会发⽣。管程是什么?-⼀个管程是⼀个由过程,变量,及数据结构组成的⼀个集合。他们组成⼀个特殊的模块和软件包,程序可以在任意时刻调⽤管程中的过程,但他们不能再管程之外声明的过程中直接使⽤管程中的数据结构。另外,管程是概念语⾔,C语⾔不⽀持管程。monitorexampleintegeri;conditionc;produceproducer();end;producerconsumer();endmonitor;以下是采⽤java实现管程⽅式的⽣产者消费者问题,说到底,其实就是采⽤了⼀个辅助类,publicclassProducerConsumer{staticfinalintN=100;staticproducerp=newproducer();staticconsumerc=newconsumer();staticour_monitormon=newour_monitor();//创建新的管程publicstaticvoidmain(Stringargs[]){p.start();c.start();}staticclassproducerextendThread{publicvoidrun(){intitem;while(true){item=produce_item();mon.insert(item);}}privateintproduce_item(){//⽣产活动中。。。}}staticclassconsumerextendThread{publicvoidrun(){intitem;while(true){item=mon.remove();consumer_item(item);}}privatevoidconsumer_item(intitem){//消费。。。。}}staticclassour_monitor{privateintbuffer[]=newint[N];privateintcount=0,io=0,hi=0;//计数器和索引publicsynchronizedvoidinsert(intval){if(count==N)go_to_sleep();buffer[hi]=val;hi=(hi+1)%N;count++;if(count==1)notify();}publicsynchronizedintremove(){intval;if(count==0)go_to_sleep();val=buffer[io];io=(io+1)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论