操作系统生产者消费者问题C语言_第1页
操作系统生产者消费者问题C语言_第2页
操作系统生产者消费者问题C语言_第3页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统概念第七版中的实验项目:生产者消费者问题。本程序中,main() 函数需要三个参数:主线程休眠时间;生产者线程数;消费者线程数。各线程的休眠等待时间是随机的。程序代码:#include #include #include #include #define buffer_size 5 typedef int buffer_item; struct v ( int i; ;buffer_item bufferbuffer_size+1; buffer_item front=0,rear=0; handle mutex,empty,full; int insert_item(buffer_i

2、tem item) ( /*insert item into buffer return 0 if successful,otherwise return -1 indicating an error condition*/ if(rear+1)%(buffer_size+1)=front) return 1; bufferrear=item; rear=(rear+1)%(buffer_size+1); return 0; int remove_item(buffer_item *item) ( /*remove an object from buffer placing it in ite

3、m return 0 if successful,otherwise reutrn -1 indication an error condition */ if(front = rear) return 1; *item=bufferfront; front=(front+1) % (buffer_size+1); return 0; dword winapi producer(pvoid param) ( int rand1; struct v data=*(struct v *)param; srand(unsigned)time(0); while (1) ( sleep(rand()%

4、101*10); waitforsingleobject(empty,infinite); waitforsingleobject(mutex,infinite); randl =rand(); n”,rand1,data.i);if(insert_item(rand1) printf(insert data error!n); releasemutex(mutex); releasesemaphore(full,1,null); dword winapi consumer(pvoid param) ( int rand1; struct v data=*(struct v *)param;

5、srand(unsigned)time(0); while (1) ( sleep(rand()%101*10); waitforsingleobject(full,infinite); waitforsingleobject(mutex,infinite); if(remove_item(&rand1) printf(remove data error! n); else printf(consumer consumed %d by %d n,rand1,data.i); releasemutex(mutex); releasesemaphore(empty,1,null); int

6、 main(int argc,char *argv) ( /*get command line arguments argv1)(the number of producer threads),argv2(the number of consumer threads),argv3(sleep time)*/ /*initialize buffer*/ int sleeptime,pnum,snum; int *threadidp,*threadids,i; struct v *countp,*counts; handle *threadhandlep,*threadhandles; sleep

7、time=atoi(argv1); pnum=atoi(argv2); snum=atoi(argv3); /*srand(time(null); sleeptime=9000; pnum=3; snum=3;*/ threadhandlep=(handle * )malloc(pnum * sizeof(handle); threadhandles=(handle * )malloc(snum * sizeof(handle); threadidp=(int * )malloc(pnum * sizeof(int); threadids=(int * )malloc(pnum * sizeo

8、f(int); mutex=createmutex(null,false,null); empty=createsemaphore(null,buffer_size,buffer_size,null); full=createsemaphore(null,0,buffer_size+1,null); /*create producer thread(s)*/ countp=(struct v *)malloc(pnum+1)*sizeof(struct v); counts=(struct v *)malloc(snum+1)*sizeof(struct v); for(i=0;ipnum;i

9、+) ( countpi+1.i=i+1; threadhandlepi=createthread(null,0,producer,&countpi+1,0,&threadidpi); /*create consumer thread(s)*/ for(i=0;isnum;i+) ( countsi+1.i=i+1; threadhandlesi=createthread(null,0,consumer,&countsi+1,0,&threadidsi); /*sleep*/ sleep(sleeptime); /*exit*/ return 0; #inclu

10、de stdafx.h #include #include #include #include #define buffer size5 typedef int buffer_item struct v int i ; ; buffer_item buffer buffer_size1; buffer_item front =0, rear =0; handlemutex, empty, full ; int insert_item ( buffer_item item ) /*insert item into buffer return 0 if successful,otherwise r

11、eturn -1 indicating an error condition*/ if ( rear +1)%(buffer_size1)= front ) return 1; buffer rear = item ; rear =( rear +1)%(buffer_siz+1); return 0; int remove_item ( buffer_item * item ) /*remove an object from buffer placing it in item return 0 if successful,otherwise reutrn -1 indication an e

12、rror condition */ if (front = rear ) return 1; * item =buffer front ; front =(front +1) % ( buffer_siz+1); return 0; dworwinapi producer (pvoid param) int rand1 ; struct v data =*( struct v *) param; srand ( unsigned )time (0); while (1) ( sleep( rand ()%101*10); waitforsingleobject ( empty, infinit

13、e ); waitforsingleobject ( mutex, infinite ); rand1 = rand (); printf ( producer has producerd %d by %dn , rand1 , data . i ); if ( insert_item ( rand1 ) printf ( insert data error!n ); releasemutex (mutex); releasesemaphore(full ,1, null; dworwinapi consumer(pvoid param) ( int rand1 ; struct v data

14、 =*( struct v *) param; srand ( unsigned ) time (0); while (1) ( sleep( rand ()%101*10); waitforsingleobject ( full , infinite ); waitforsingleobject ( mutex, infinite ); if ( remove_item (& rand1 ) printf ( remove data error! n ); else printf ( consumer consumed %d by %d n , rand1 , data . i );

15、 releasemutex (mutex); releasesemaphore(empty,1, null); int main( int argc , char * argv ) ( /*get command line arguments argv1)(the number of producer threads),argv2(the number of consumer threads),argv3(sleep time)*/ /*initialize buffer*/ int sleeptime , pnum, snum; dwor*dthreadidp ,* threadids ,

16、i ; struct v * countp ,* counts ; handle threadhandlep ,* threadhandles ; /*sleeptime=atoi(argv1); pnum=atoi(argv2); snum=atoi(argv3);*/ /srand(time(null); sleeptime =9000; pnum=3; snum=3; threadhandlep =(handle* ) malloc (pnum* sizeof (handle; threadhandles =(handle* ) malloc (snum * sizeof (handle

17、; threadidp =(dword) malloc (pnum * sizeof ( dword threadids =(dword) malloc (pnum * sizeof ( dwofrd mutex=createmutex (null false null; empty=createsemaphore( null buffer_sizebuffer_sizenull; full =createsemaphore( null。,buffer_siz+1, null; /*create producer thread(s)*/ countp =( struct v *) malloc ( pnum+1)* sizeof (struct v); counts =( struct v *) malloc ( snum+1)* sizeof (struct v); for (i =0; i pnum i +) ( countp i +1. i =i +1; threadhandlep i = createthread

温馨提示

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

评论

0/150

提交评论