用多线程同步方法解决生产者-消费者问题

上传人:精****档 文档编号:43834197 上传时间:2018-06-07 格式:DOC 页数:11 大小:128.50KB
返回 下载 相关 举报
用多线程同步方法解决生产者-消费者问题_第1页
第1页 / 共11页
用多线程同步方法解决生产者-消费者问题_第2页
第2页 / 共11页
用多线程同步方法解决生产者-消费者问题_第3页
第3页 / 共11页
用多线程同步方法解决生产者-消费者问题_第4页
第4页 / 共11页
用多线程同步方法解决生产者-消费者问题_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《用多线程同步方法解决生产者-消费者问题》由会员分享,可在线阅读,更多相关《用多线程同步方法解决生产者-消费者问题(11页珍藏版)》请在金锄头文库上搜索。

1、目目 录录1. 需求分析.11.1 课程设计题目.1 1.2 课程设计任务.1 1.3 课程设计原理.1 1.4 课程设计要求.1 1.5 实验环境.12. 概要设计.22.1 课程设计方案概述.2 2.2 课程设计流程图.23.详细设计.33.1 主程序模块.3 3.2 生产者程序模块.4 3.3 消费者程序模块.54.调试中遇到的问题及解决方案.55.运行结果.66.实验小结.7参考文献.7附录:源程序清单.7武汉理工大学华夏学院操作系统原理课程设计报告11.1. 需求分析需求分析1.11.1 课程设计题目课程设计题目用多线程同步方法解决生产者消费者问题1.21.2 课程设计任务课程设计任

2、务(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者消费者线程的标识符。(2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。1.31.3 课程设计原理课程设计原理生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程(进程由多个线程组成)生产信息,消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存

3、储区(即缓冲区),以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。1.41.4 课程设计要求课程设计要求(1)有界缓冲区内设有 20 个存储单元,放入取出的数据项设定为 120 这 20 个整型数。(2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者消费者线程的标识符。(3)生产者和消费者各有两个以上。(4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。1.51.5 实验环境实验环境系统平台:LINUX开发语言:C 开发工具:PC 机一台武汉理工大学华夏学院操作系统原理课程设计报告22.2. 概要设计概要设计2.

4、12.1 课程设计方案概述课程设计方案概述本设计中设置一个长度为 20 的一维数组 buff20作为有界缓冲区,缓冲区为 0 时,代表该缓冲区内没有产品,buffi=i+1 表示有产品,产品为 i+1。设置 3 个同步信号灯:一个说明空缓冲区的数目,用 empty 表示,其初值为有界缓冲区的大小 20 ;另一个说明满缓冲区(即产品)的数目,用 full 表示,其初值为 0。由于缓冲区是临界资源,必须互斥使用,所以还设置了一个互斥信号灯 mutex,其初值为 1。用这 3 个信号灯有效控制多个生产者线程和多个消费者线程的同步准确的运行。Main()函数中调用函数 sem_init()对信号灯进行

5、初始化;利用 for 语句循环创建 5 个producer(生产者)分离线程和 5 个 consumer(消费者)分离线程;Producer 线程通过调用函数sem_wait(initbuff();for(i=0;i#include#include#includeint buff20=0; /有界缓冲区定义int b=0; /缓冲区的输出指针int p=1;int c=1;int c1=0; /消费数据变量sem_t full; /缓冲区的数量信号灯sem_t empty; /缓冲区满信号灯sem_t mutex; /互斥信号灯pthread_t id15;pthread_t id25;武汉理

6、工大学华夏学院操作系统原理课程设计报告8void initbuff() /初始化信号灯 sem_init(sem_init(sem_init( /初始化互斥信号灯 void printbuff() /打印缓冲区 int j;printf(“datas in buff are:“);for(j=0;j20;j+)printf(“%d “,buffj);printf(“n“); void producer() /生产者 int pid=0;int j,k;pid=pthread_self();while(1) for(j=0;j5;j+) if(pid=id1j) k=j+1; sem_wait(

7、sem_wait(if(p%21!=0) buffb=p%21;printf(“producer %d produce:%dn“,k,p%21);printbuff();b+;p+; else p+;sem_post(sem_post(sleep(4); void consumer() /消费者 int cid=0;int j,k;cid=pthread_self();while(1)武汉理工大学华夏学院操作系统原理课程设计报告9 for(j=0;j5;j+) if(cid=id2j) k=j+1; sem_wait( /看是否有数据在缓冲区sem_wait( /临界区if(c%21!=0)

8、c1=buffb-1;printf(“consumer %d consume:%dn“,k,c1);buffb-1=0;printbuff();b-;c+; else c+;sem_post(sem_post( sleep(6); int main(void) int i;initbuff();for(i=0;i5;i+)pthread_create( /创建生产者线程for(i=0;i5;i+)pthread_create( /创建消费者线程for(i=0;i5;i+) pthread_join(id1i,NULL);pthread_join(id2i,NULL); exit(0); /等待生产者线程,消费者线程,结束主线程武汉理工大学华夏学院操作系统原理课程设计报告10设计过程中质疑(或答辩)记载: 1. 生产者和消费者是如何从缓冲区中存放和读取数据的? 答:生产者将生产的产品从头到尾存入缓冲区,消费者从缓冲区中最后一个开 始读取,即从后往前取。 2.设计中用到的三个信号灯各有什么作用? 答:信号灯 full 是用来判断缓冲区中是否已满,如果满了就会发生阻塞,即生 产者先暂停生产,信号灯 empty 是用来判断缓冲区是否还有产品,如果没有, 消费者就暂停消费,互斥信号灯 mutex 是用来对临界资源的操作权进行控制的。指导教师评语:签名:2009 年 7 月

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号