2022年用多线程同步方法解决生产者-消费者问题推荐 .pdf

上传人:Q****o 文档编号:27521135 上传时间:2022-07-25 格式:PDF 页数:11 大小:255.36KB
返回 下载 相关 举报
2022年用多线程同步方法解决生产者-消费者问题推荐 .pdf_第1页
第1页 / 共11页
2022年用多线程同步方法解决生产者-消费者问题推荐 .pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《2022年用多线程同步方法解决生产者-消费者问题推荐 .pdf》由会员分享,可在线阅读,更多相关《2022年用多线程同步方法解决生产者-消费者问题推荐 .pdf(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、目录1. 需求分析 . 11.1 课程设计题目 . 11.2 课程设计任务 . 11.3 课程设计原理 . 11.4 课程设计要求 . 11.5 实验环境 . 12. 概要设计 . 22.1 课程设计方案概述. 22.2 课程设计流程图. 23. 详细设计. 33.1 主程序模块. 33.2 生产者程序模块 . 43.3 消费者程序模块. 54. 调试中遇到的问题及解决方案 . 55. 运行结果. 66. 实验小结. 7参考文献 . 7附录:源程序清单. 7名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - -

2、 - - - - 第 1 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告1 1. 需求分析1.1 课程设计题目用多线程同步方法解决生产者消费者问题1.2 课程设计任务(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者消费者线程的标识符。(2)生产者和消费者各有两个以上。(3)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。1.3 课程设计原理生产者和消费者问题是从操作系统中的许多实际同步问题中抽象出来的具有代表性的问题,它反映了操作系统中典型的同步例子,生产者进程( 进程由多个线程组

3、成) 生产信息,消费者进程使用信息,由于生产者和消费者彼此独立,且运行速度不确定,所以很可能出现生产者已产生了信息而消费者却没有来得及接受信息这种情况。为此,需要引入由一个或者若干个存储单元组成的临时存储区(即缓冲区) ,以便存放生产者所产生的信息,解决平滑进程间由于速度不确定所带来的问题。1.4 课程设计要求(1) 有界缓冲区内设有20 个存储单元,放入取出的数据项设定为120 这 20 个整型数。(2) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前指针位置和生产者消费者线程的标识符。(3) 生产者和消费者各有两个以上。(4) 多个生产者或多个消费者之间须共享

4、对缓冲区进行操作的函数代码。1.5 实验环境系统平台: LINUX 开发语言: C 开发工具: PC机一台名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告2 2. 概要设计2.1 课程设计方案概述本设计中设置一个长度为20 的一维数组buff20作为有界缓冲区,缓冲区为0 时,代表该缓冲区内没有产品,buffi=i+1表示有产品,产品为i+1 。设置 3 个同步信号灯:一个说明空缓冲

5、区的数目,用empty 表示,其初值为有界缓冲区的大小 20 ;另一个说明满缓冲区( 即产品 ) 的数目,用full表示,其初值为0。由于缓冲区是临界资源,必须互斥使用,所以还设置了一个互斥信号灯mutex,其初值为1。用这 3 个信号灯有效控制多个生产者线程和多个消费者线程的同步准确的运行。Main()函数中调用函数sem_init()对信号灯进行初始化;利用for语句循环创建5 个producer( 生产者 ) 分离线程和5 个 consumer( 消费者 ) 分离线程; Producer线程通过调用函数sem_wait(&empty)判 断 是 否 有 空 缓 冲 区 。 若 无 , 则

6、 阻 塞 当 前 线 程 , 若 有 则 调 用 函 数sem_wait(&mutex) 等待对临界资源的操作权,当mntex 为 1 时,便获得临界资源的操作权,可将产品放入缓冲区,及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex)和sem_post(&full)来释放缓冲区操作权和增加满缓冲区信号量的值;Consumer 线程通过调用函数 sem_wait(&full) 判断 是 否 有满 缓 冲区 。 若无 , 则阻塞 当 前线 程 ,若 有 则 调用 函数sem_wait(&mutex) 等待对临界资源的操作权,当mntex 为 1 时,便获得临界资源的操作权,可

7、从满缓冲区中取出产品消费,并及时输出缓冲区里的内容。然后依次调用函数sem_post(&mutex)和 sem_post(&emptyl)来释放缓冲区操作权和增加空满缓冲区信号量的值。Producer和Consumer 线程中均用缓冲区指针b 指出当前是对哪一个缓冲区进行放入/ 取出操作;并调用pthread_self()函数来显示其自身的标识符。2.2 课程设计流程图设计中主要有三个模块,首先从主程序中进入,完成初始化及创建好生产者和消费者线程后,进入生产者或消费者模块,具体流程见程序设计流程图如图1 所示:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -

8、 - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告3 图 1 程序设计流程图3. 详细设计3.1 主程序模块主程序中利用函数sem_init()对信号灯进行初始化;利用for语句循环创建3 个producer( 生产者 ) 分离线程和3 个 consumer( 消费者 ) 分离线程,程序段如下:int main(void) 开始初始化创建生产者线程和消费者线程生产者消费者生产empty的P操作Buff满mutex的P操作暂停mutex的V操作full的V操作否是Buf

9、f空否full的P操作mutex 的P操作消费mutex 的V操作Empty 的V操作暂停是名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告4 int i; initbuff(); for(i=0;i5;i+) pthread_create(&id1i,NULL,(void *)producer,(&i); /创建生产者线程for(i=0;i5;i+) pthread_create(

10、&id2i,NULL,(void *)consumer,(&i); /创建消费者线程for(i=0;i5;i+) pthread_join(id1i,NULL); pthread_join(id2i,NULL); exit(0); /等待生产者线程,消费者线程,结束主线程3.2 生产者程序模块Producer 线程通过调用函数sem_wait(&empty) 判断是否有空缓冲区。若无,则阻塞当前线程,若有则调用函数sem_wait(&mutex) 等待对临界资源的操作权,当mntex 为1 时,便获得临界资源的操作权,可将产品放入缓冲区,及时输出缓冲区里的内容;并用指针 b 指出当前是对哪一个

11、缓冲区进行放入/取出操作,且调用pthread_self()函数来显示其自身的标识符。然后依次调用函数sem_post(&mutex) 和 sem_post(&full) 来释放缓冲区操作权和增加满缓冲区信号量的值,程序段如下: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(&empty); /P操作,判断缓冲区是否有空位置 sem_wait(&mutex); /P操作,获得对临界资源的操作权 i

12、f(p%21!=0) buffb=p%21; printf(producer %d produce:%dn,k,p%21); printbuff(); b+; p+; else p+; sem_post(&mutex); /V操作,释放临界资源名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告5 sem_post(&full); /V操作,满缓冲区信号灯加1 sleep(4); 3.3

13、 消费者程序模块Consumer 线程调用调用函数sem_wait(&full) 判断是否有满缓冲区。若无,则阻塞当前线程, 若有则调用函数sem_wait(&mutex) 等待对临界资源的操作权,当mntex 为 1时,便获得临界资源的操作权,可从满缓冲区中取出产品消费,并及时输出缓冲区里的内容,并用指针 b 指出当前是对哪一个缓冲区进行放入/取出操作, 且调用 pthread_self()函数来显示其自身的标识符。然后依次调用函数sem_post(&mutex) 和 sem_post(&emptyl)来释放缓冲区操作权和增加空满缓冲区信号量的值,程序段如下:void consumer()

14、/消费者 int cid=0; int j,k; cid=pthread_self(); /获得消费者标识符 while(1) for(j=0;j5;j+) if(cid=id2j) k=j+1; sem_wait(&full); /P操作,判断缓冲区是否已满 sem_wait(&mutex); /P操作,获得对临界资源的操作权 if(c%21!=0) c1=buffb-1; printf(consumer %d consume:%dn,k,c1); buffb-1=0; printbuff(); b-; c+; else c+; sem_post(&mutex); /V操作,释放临界资源 s

15、em_post(&empty); /V操作,释放一个空位置 sleep(6); 4. 调试中遇到的问题及解决方案在调试过程中主要遇到三个问题:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告6 1.在设计刚完成的时候,我并没有用pid=pthread_self()和 cid=pthread_self()来获得生产者和消费者的标识符,所以运行的结果是生产者和消费者的标识符都是随机的,后

16、来问同学才找到这种调用方法。2.我想让生产者无限的生产,消费者无限的消费,所以就用了一个条件判断语句,判断的条件是p%21!=0,而我写成了p/21!=0 ,所以运行的结果是生产者的生产是混乱的,没有规律。3. 刚开始我的运行结果还有一个问题就是生产者生产超过21 的产品后, 产品号不是1,2等,而是 21, 22, ,后来检查后才发现printf(producer %d produce:%dn,k,p%21)中的产品号不是p%21 ,所以出现那种情况。5. 运行结果显示结果如下:( 部分运行结果 ) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - -

17、 - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告7 6. 实验小结这次课程设计主要针对的是操作系统中的经典问题即:生产者消费者问题使用多线程控制, 刚拿到设计题目时心里其实挺没底的,因为之前我对线程不是很了解,不过幸好老师上课的时候给了我们一个关于Linux多线程编程的文档,里面详细的介绍了线程的一些基本命令,所以我在这次设计中基本上都用的是文档里的命令。从这次课程设计中,我对线程的概念以及一些命令都有了一定的理解和掌握,并且也知道了它与进程之间的区别,除此之外, 通过这次

18、课程设计让我对操作系统中的经典问题,生产者消费者问题有了更深的理解,在做设计的过程中,也对上课的内容加深了理解并进行了巩固。参考文献1 庞丽萍 . 操作系统原理 . 华中科技大学出版社.2009 年 1 月。2 蒋静 徐志伟 . 操作系统原理技术与编程M. 北京 : 机械工业出版社,20043 张红光李福才 .UNIX 操作系统。机械工业出版社。2006 年 1 月4 汤子瀛等 . 计算机操作系统. 西安电子科技大学出版社.2001 年 5 月5 付国瑜杨武周敏 . 计算机操作系统原理及应用上机实验指导. 重庆工学院计算机学院.2005 年 1 月. 附录:源程序清单#include #inc

19、lude #include #include int 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; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - -

20、 武汉理工大学华夏学院操作系统原理课程设计报告8 void initbuff() /初始化信号灯 sem_init(&full,0,0); sem_init(&empty,0,20); sem_init(&mutex,0,1); /初始化互斥信号灯 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)

21、for(j=0;j5;j+) if(pid=id1j) k=j+1; sem_wait(&empty); sem_wait(&mutex); if(p%21!=0) buffb=p%21; printf(producer %d produce:%dn,k,p%21); printbuff(); b+; p+; else p+; sem_post(&mutex); sem_post(&full); sleep(4); void consumer() /消费者 int cid=0; int j,k; cid=pthread_self(); while(1) 名师资料总结 - - -精品资料欢迎下载

22、 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告9 for(j=0;j5;j+) if(cid=id2j) k=j+1; sem_wait(&full); /看是否有数据在缓冲区 sem_wait(&mutex); /临界区 if(c%21!=0) c1=buffb-1; printf(consumer %d consume:%dn,k,c1); buffb-1=0; printbuff(); b-; c+; else c

23、+; sem_post(&mutex); sem_post(&empty); sleep(6); int main(void) int i; initbuff(); for(i=0;i5;i+) pthread_create(&id1i,NULL,(void *)producer,(&i); /创建生产者线程 for(i=0;i5;i+) pthread_create(&id2i,NULL,(void *)consumer,(&i); /创建消费者线程 for(i=0;i5;i+) pthread_join(id1i,NULL); pthread_join(id2i,NULL); exit(0

24、); /等待生产者线程,消费者线程,结束主线程名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 武汉理工大学华夏学院操作系统原理课程设计报告10 设计过程中质疑(或答辩)记载:1. 生产者和消费者是如何从缓冲区中存放和读取数据的?答:生产者将生产的产品从头到尾存入缓冲区,消费者从缓冲区中最后一个开始读取,即从后往前取。2.设计中用到的三个信号灯各有什么作用?答:信号灯 full 是用来判断缓冲区中是否已满,如果满了就会发生阻塞,即生产者先暂停生产, 信号灯 empty是用来判断缓冲区是否还有产品,如果没有, 消费者就暂停消费,互斥信号灯mutex 是用来对临界资源的操作权进行控制的。指导教师评语:签名:2009 年 7 月 03 日名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术总结

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com