




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
20102011第2学期实时操作系统期末大作业题目:多线程同步方法解决生产者消费者问题专业:08电子信息工程班级: 2班学号:120081003260姓名:燕永忠成绩:一、 设计内容:多线程同步方法解决生产者消费者问题:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费。为使生产者线程与消费者线程能并发执行,在两者之间设置了一个具有N个缓冲区的缓冲池,生产者线程不断地将它所生产的产品放入一个缓冲区中;消费者线程不断地从缓冲区中取走产品去消费。尽管所有的生产者线程和消费者线程都是以异步方式运行,但它们之间必须保持同步,即不允许消费者线程到一个空的缓冲区取产品,也不允许生产者线程向一个已装满产品且尚未取走的缓冲区投放产品。 二、 设计要求:1) 为每个生产者消费者产生一个线程,设计正确的同步算法。2) 每个生产者和消费者对有界缓冲区进行操作后,及时显示当前缓冲区的全部内容、指针位置以及生产者/消费者线程的ID标识符。3) 生产者和消费者各有三个以上。4) 多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。5) 比较并讨论各个线程不同的延时,以及缓冲池N的不同取值,对系统运行结果有什么影响?三,设计思想:在本问题中,共需要一个Mutex和两个Semaphore.其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对生成者还是对消费者);我们共需要两个Semaphore,这是因为在本问题中共有两个稀缺资源.第一种是非空这种资源,是在消费者之间进行竞争的.第二种是非满这种资源,是在生产者之间进行竞争的.所以,一般来说,需要锁定临界区,就需要Mutex;有几种稀缺资源就需要几个Semaphore.对稀缺资源的分析不能想当然.稀缺资源不一定是指被共享的资源,很多时候是指线程会被阻塞的条件(除了要进临界区被阻塞外).在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以非空是一种稀缺资源; 需要设置一个信号量consumer_semaphore,初值设为0;生产者会在缓冲区为满时被阻塞,所以非满也是一种稀缺资源.需要设置一个信号量producer_semaphore,初值设为buffer的大小MAX_BUFFER四、功能模块说明(含数据结构):1、void produce(struct sem_info * );这个函数是生产者进行的生产过程,为所有的生产者所共享。结构体指针用来接收生产者线程创建时传来的生产者的个人信息。2、void consumer(struct sem_info * );这个函数是消费者进行的生产过程,为所有的消费者所共享。结构体指针用来接收消费者线程创建时传来的消费者的个人信息。3、void setproduce(void);这个函数是用来设置生产者的个数和他们的名字。4、void setconsumer(void);这个函数是用来设置消费者的个数和他们的名字。5、void activepthread(int);这个函数是用来创建生产者线程,int型参数为生产者的个数。6、void activecthread(int);这个函数是用来创建生产者线程,int型参数为生产者的个数。7、int gettime(void);这个函数返回来一个整数,作为线程的sleep()函数的参数。8、void myscanf(void);这个函数用来获取设置生产者和消费者的个数时的整数,确保这个数字在0到MAX_BUFFER之间。五 系统流程图:生产者或者消费者三、 程序源码:源程序清单如下:#include#include#include#include#include#include#include#include#include#include#define NUM_THREADS_P 5 /*define the number of producer*/#define NUM_THREADS_C 5 /*define the number of consumer*/#define MAX_BUFFER 20 /*define the number of buffer*/#define RUN_TIME 20 /*define the run time*/int bufferMAX_BUFFER; /*difine the buffer */int produce_pointer=0,consume_pointer=0;sem_t producer_semaphore,consumer_semaphore,buffer_mutex;pthread_t threads_pNUM_THREADS_P; /*producer*/pthread_t threads_cNUM_THREADS_C; /*consumer*/FILE* fd; void *producer_thread(void *tid);void *consumer_thread(void *tid);void showbuf();void handler()int i;for(i=0;iNUM_THREADS_P;i+)pthread_cancel(threads_pi);for(i=0;iNUM_THREADS_C;i+)pthread_cancel(threads_ci);int main()int i;signal(SIGALRM,handler);fd=fopen(output.txt,w); /*open a file to save the result*/sem_init(&producer_semaphore,0,MAX_BUFFER); /*set the value of semaphores*/sem_init(&consumer_semaphore,0,0);sem_init(&buffer_mutex,0,1);for(i=0;iMAX_BUFFER;i+)bufferi=0; /*initiate the buffer*/*create the threads*/for(i=0;iNUM_THREADS_P;i+)pthread_create(&threads_pi,NULL,(void*)producer_thread,(void*)(i+1);for(i=0;iNUM_THREADS_C;i+)pthread_create(&threads_ci,NULL,(void*)consumer_thread,(void *)(i+1);alarm(RUN_TIME); /*set time to run*/*wait the threads to exit*/for(i=0;iNUM_THREADS_P;i+)pthread_join(threads_pi,NULL);for(i=0;iNUM_THREADS_C;i+)pthread_join(threads_ci,NULL);/*destroy the semaphores*/sem_destroy(&producer_semaphore); sem_destroy(&consumer_semaphore);sem_destroy(&buffer_mutex);fclose(fd);return 0;void *producer_thread(void *tid)/*the thread can be canceled by other thread*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);while(1)sem_wait(&producer_semaphore);srand(int)time(NULL)*(int)tid);sleep(rand()%2+1); /*one or two seconds to produce*/while(produce_pointer+1)%20=consume_pointer);sem_wait(&buffer_mutex);bufferproduce_pointer=rand()%20+1;produce_pointer=(produce_pointer+1)%20;if(produce_pointer=0) /*if buffer was filled to the 19th*/printf(producer:%d pointer_p:%2d produced:%2dn,(int)tid,19,buffer19);fprintf(fd,producer:%d pointer_p:%2d produced:%2dn,(int)tid,19,buffer19);elseprintf(producer:%d pointer_p:%2d produced:%2dn,(int)tid,produce_pointer-1,bufferproduce_pointer-1);fprintf(fd,producer:%d pointer_p:%2d produced:%2dn,(int)tid,produce_pointer-1,bufferproduce_pointer-1);showbuf();sem_post(&buffer_mutex);sem_post(&consumer_semaphore); /*inform the consumer the buffer is not empty*/srand(int)time(NULL)*(int)tid);sleep(rand()%5+1); /*wait a few seconds ,then continue producing*/return (void*)0);void *consumer_thread(void *tid)/*the thread can be canceled by other thread*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);while(1)sem_wait(&consumer_semaphore);srand(int)time(NULL)*(int)tid);sleep(rand()%2+1); /*one or two seconds to consume*/sem_wait(&buffer_mutex);printf(consumer:%d pointer_c:%2d consumed:%2dn,(int)tid,consume_pointer,bufferconsume_pointer);fprintf(fd,consumer:%d pointer_c:%2d consumed:%2dn,(int)tid,consume_pointer,bufferconsume_pointer);bufferconsume_pointer=0;consume_pointer=(consume_pointer+1)%20;showbuf();sem_post(&buffer_mutex);sem_post(&producer_semaphore); srand(int)time(NULL)*(int)tid);sleep(rand()%5+1); /*wait a few seconds ,then continue consuming*/return (void*)0);/*show the content of buffer*/void showbuf()int i;printf(buffer:);fprintf(fd,buffer:);for(i=0;iMAX_BUFFER;i+)printf(%2d ,bufferi);fprintf(fd,%2d ,bufferi);printf(nn);fprintf(fd,nn);四、 系统运行情况(包含调试记录):程序运行结果如下:producer:1 pointer_p: 0 produced:20buffer:20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:3 pointer_p: 1 produced:13buffer:20 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:2 pointer_p: 2 produced: 6buffer:20 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:4 pointer_p: 3 produced:14buffer:20 13 6 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:5 pointer_p: 4 produced:20buffer:20 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:2 pointer_c: 0 consumed:20buffer: 0 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:1 pointer_p: 5 produced:20buffer: 0 13 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:1 pointer_c: 1 consumed:13buffer: 0 0 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:3 pointer_c: 2 consumed: 6buffer: 0 0 0 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:4 pointer_c: 3 consumed:14buffer: 0 0 0 0 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:5 pointer_c: 4 consumed:20buffer: 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:3 pointer_p: 6 produced: 1buffer: 0 0 0 0 0 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:2 pointer_p: 7 produced:14buffer: 0 0 0 0 0 20 1 14 0 0 0 0 0 0 0 0 0 0 0 0 consumer:3 pointer_c: 5 consumed:20buffer: 0 0 0 0 0 0 1 14 0 0 0 0 0 0 0 0 0 0 0 0 producer:4 pointer_p: 8 produced: 6buffer: 0 0 0 0 0 0 1 14 6 0 0 0 0 0 0 0 0 0 0 0 consumer:5 pointer_c: 6 consumed: 1buffer: 0 0 0 0 0 0 0 14 6 0 0 0 0 0 0 0 0 0 0 0 producer:5 pointer_p: 9 produced: 8buffer: 0 0 0 0 0 0 0 14 6 8 0 0 0 0 0 0 0 0 0 0 consumer:2 pointer_c: 7 consumed:14buffer: 0 0 0 0 0 0 0 0 6 8 0 0 0 0 0 0 0 0 0 0 consumer:5 pointer_c: 8 consumed: 6buffer: 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 producer:1 pointer_p:10 produced:18buffer: 0 0 0 0 0 0 0 0 0 8 18 0 0 0 0 0 0 0 0 0 consumer:1 pointer_c: 9 consumed: 8buffer: 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0 producer:2 pointer_p:11 produced:10buffer: 0 0 0 0 0 0 0 0 0 0 18 10 0 0 0 0 0 0 0 0 producer:4 pointer_p:12 produced:10buffer: 0 0 0 0 0 0 0 0 0 0 18 10 10 0 0 0 0 0 0 0 consumer:4 pointer_c:10 consumed:18buffer: 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0 producer:3 pointer_p:13 produced: 3buffer: 0 0 0 0 0 0 0 0 0 0 0 10 10 3 0 0 0 0 0 0 consumer:3 pointer_c:11 consumed:10buffer: 0 0 0 0 0 0 0 0 0 0 0 0 10 3 0 0 0 0 0 0 consumer:2 pointer_c:12 consumed:10buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 producer:1 pointer_p:14 produced: 6buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 0 0 0 0 0 consumer:1 pointer_c:13 consumed: 3buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 producer:2 pointer_p:15 produced:18buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 18 0 0 0 0 consumer:5 pointer_c:14 consumed: 6buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 producer:1 pointer_p:16 produced: 6buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 0 0 0 producer:3 pointer_p:17 produced:19buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 19 0 0 consumer:1 pointer_c:15 consumed:18buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 0 0 producer:5 pointer_p:18 produced: 7buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 7 0 consumer:3 pointer_c:16 consumed: 6buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 0 producer:4 pointer_p:19 produced:14buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 14 consumer:5 pointer_c:17 consumed:19buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 14 consumer:4 pointer_c:18 consumed: 7buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 producer:1 pointer_p: 0 produced: 4buffer: 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14 consumer:2 pointer_c:19 consumed:14buffer: 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 consumer:1 pointer_c: 0 consumed: 4buffer: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:2 pointer_p: 1 produced:15buffer: 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:3 pointer_p: 2 produced:13buffer: 0 15 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 producer:2 pointer_p: 3 produced: 3buffer: 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 说明: “producer:2”是指自定义标号为2的producer,“pointer_p:3”是指该producer的指针,“produced:3”是指该producer在buffer3里写入3,“buffer: 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ”是指该producer进行写操作后存储区的内容。五、 讨论与总结:通过这次课程设计,不但加深了对操作系统这们课程的认识,而且还了解了操作系统中使用信号量解决生产者消费者问题算法的实现。比如:用信号量解决生产者消费者问题时,可以通
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年天文漫谈题目及答案初中
- 丽江古城翻译真题及答案
- 社区网格员考试试题及答案
- 混凝土搅拌工高级模拟练习题含答案
- nr考试复习测试有答案
- 有氧运动直播题目及答案
- 楼顶工程防水补漏方案(3篇)
- 《电子测量原理简明教程》-6章成本法发送习题答案
- 2025年科比的题目及答案
- 深度研究2025年能源行业智能电网优化在数字化转型中的能源市场风险管理报告
- GB/T 4745-2012纺织品防水性能的检测和评价沾水法
- 教师节课件模板
- 移动商务文案写作-第3章课件
- 全科医学的基本原则和特点课件
- 国家综合性消防救援队伍消防员管理规定
- 医药公司新员工考评表
- 生态农庄设计规划课件
- 《工程制图完整》课件
- 互换性与测量技术基础总复习题与答案
- 预防校园欺凌主题班会课件(共36张PPT)
- 北京工业地产工业园区调研报告
评论
0/150
提交评论