操作系统多线程设计报告

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

生产者-消费者多线程问题设计报告1.设计目的与要求1.1设计目的通过研究Linux的线程机制和信号量实现生产者消费者问题的并发控制。1.2设计要求1)创建3个生产者线程和2个消费者线程库存大小为102)生产者共享一个变量产品编号productID,每生产一个产品,productID加1,不能出现重复编号3)每个生产者每生产一个产品,打印出生产者的进程/线程标识符信息,以及生产的产品编号信息4)消费者每消费一个产品,打印出消费者的进程/线程标识符信息,以及消费的产品编号信息5)生产者生产一个产品后,休眠2ms;消费者消费一个产品后,休眠3ms2.设计思想及系统平台2.1设计思想1)函数:void*produce(void*tid);生产者函数,用来生产一个产品,并将产品放入产品队列,打印生产者的相应信息。void*consume(void*tid);消费者函数,用来消费一个产品,打印消费者的相应信息,将产品队列的相应位清空。voidshowbuf();产品队列显示函数2)信号量:在消费者和生产者问题中,共需要三个信号量:Mutex,full和empty。其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对生成者还是对消费者)。而非空资源是在消费者之间进行竞争的,非满这种资源是在生产者之间进行竞争的。在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以非空资源需要设置一个信号量full,初值设为0。生产者会在缓冲区为满时被阻塞,所以非满资源需要设置一个信号量empty,初值设为buffer的大小MAX2.2系统平台及使用语言在Linux操作系统下,使用C语言完成。用到的编译器主要是gcc编译器。3.详细算法描述3.1共享数据:1)intbuffer[MAX];定义产品队列,装入的是产品编号。2)inti=0;用来产生产品编号的变量。3)intin=0,out=0;生产者和消费者的指针。4)sem_tempty,full,mutex;定义信号量。5)pthread_tproducer[ProducerNum];生产者线程数组。6)pthread_tconsumer[ConsumerNum];消费者线程数组。3.2函数算法:1)void*produce(void*tid)P(empty)P(mutex)产生产品编号,放入产品队列V(mutex)V(full)2)void*consume(void*tid)4.程序清单#includestdio.h#includepthread.h#includesemaphore.h#defineProducerNum3#defineConsumerNum2#defineMAX10P(full)P(mutex)消费一个产品,产品队列对应位清零V(mutex)V(empty)intbuffer[MAX];inti=0;intin=0,out=0;sem_tempty,full,mutex;pthread_tproducer[ProducerNum];pthread_tconsumer[ConsumerNum];void*produce(void*tid);void*consume(void*tid);voidshowbuf();intmain(){inti;sem_init(&empty,0,MAX);sem_init(&full,0,0);sem_init(&mutex,0,1);for(i=0;iMAX;i++)buffer[i]=0;for(i=0;iProducerNum;i++)pthread_create(&producer[i],NULL,(void*)produce,(void*)(i+1));for(i=0;iConsumerNum;i++)pthread_create(&consumer[i],NULL,(void*)consume,(void*)(i+1));for(i=0;iProducerNum;i++)pthread_join(producer[i],NULL);for(i=0;iConsumerNum;i++)pthread_join(consumer[i],NULL);sem_destroy(&empty);sem_destroy(&full);sem_destroy(&mutex);return0;}void*produce(void*tid){while(1){sem_wait(&empty);while((in+1)%MAX==out);sem_wait(&mutex);i++;buffer[in]=i;in=(in+1)%MAX;if(in==0){printf(生产者进程标识符为:%d生产产品编号:%d\n,(int)tid,buffer[MAX-1]);}else{printf(生产者进程标识符为:%d生产产品编号:%d\n,(int)tid,buffer[in-1]);}showbuf();sem_post(&mutex);sem_post(&full);sleep(2);}return((void*)0);}void*consume(void*tid){while(1){sem_wait(&full);sem_wait(&mutex);printf(消费者进程标识符为:%d消费产品编号:%d\n,(int)tid,buffer[out]);buffer[out]=0;out=(out+1)%MAX;showbuf();sem_post(&mutex);sem_post(&empty);sleep(3);}return((void*)0);}voidshowbuf(){inti;printf(产品队列:);for(i=0;iMAX;i++){printf(%d,buffer[i]);}printf(\n\n);}5.运行结果和运行情况程序运行结果如下:6.总结通过本次作业,我巩固了使用多线程编程的方法,和使用信号量同步进/线程的技巧。程序的运行结果跟预期的一致,说明该程序能顺利解决生产者消费者问题。另外,使我体会最深的是:任何一门知识的掌握,仅靠学习理论知识是远远不够的,要与实际动手操作相结合才能达到功效,使自己认识到实践的重要性,理论、实践相结合才能达到很好的学习效果。

1 / 10
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功