操作系统实验报告生产者消费者问题
时间:2025-07-07
时间:2025-07-07
《操作系统实验报告》
班级 计算机2011-3班 姓名 李洋 学号
2013年 12 月 31 日
一.设计目标
完成N个生产者和M个消费者线程之间的并发控制,N、M不低于30,数
据发送和接收缓冲区尺寸不小于20个(每个产品占据一个)。
其中生产者线程1、3、5、7、9生产的产品供所有奇数编号的消费者线程消费,只有所有奇数编号的消费者线程都消费后,该产品才能从缓冲区中撤销。
其中生产者线程2、4、6、8、10生产的产品所有偶数编号的消费者线程都可消费,任一偶数编号消费者线程消费该消息后,该产品都可从缓冲区中撤销。
其中11-20号生产者线程生产的产品仅供对应编号的消费者线程消费。
其他编号生产者线程生产的产品可由任意的消费者线程消费。
每个生产线程生产30个消息后结束运行。如果一个消费者线程没有对应的生产者线程在运行后,也结束运行。所有生产者都停止生产后,如果消费者线程已经没有可供消费的产品,则也退出运行。
二.背景知识说明
2.1原理
生产者与消费者线程采用posix互斥锁机制进行互斥进入各自的代码段,只有采用互斥锁临界区代码段才可以不被打扰的执行;同步机制采用的是posix条件变量pthread_cond_wait和pthraed_cond_signal进行同步的。
线程间的通信采用的是共享内存机制。(注:所有的共享内存块是在进程里建立的,线程只需链接上各自的共享内存块即可,每一块共享内存的大小是100). 在这里共享内存 设置成一个100的数组。
具体实施:(1)为1.3.5.7.9建立一个共享内存1号,1.3.5.7.9生产者线程生产的产品都放入这块共享内存缓冲区,所有奇数的消费者线程要消费的话,只需在消费者线程中链接上这块共享内存,就可以直接消费1.3.5.7.9生产者线程生产的产品。
(2)为2.4.6.8.10建立一块共享内存2号。2.4.6.8.10生产的产品都放入2号共享内存缓冲区,所有的偶数的消费者线程只要链接上2号缓冲区,就可以消费2.4.6.8.10生产的产品。当偶数消费者线程消费产品后,产品即可从缓冲区撤销,方法是在消费线程里将消费的产品在共享内存数组里置0。
(3)为11--20的每一对生产者消费者线程建立一块共享内存,编号11--20. 11--20号的消费者线程能链接各自的共享内存缓冲区或奇数或偶数共享内存缓冲区,即11--20号的生产者生产的产品只能被对应的消费者消费而11-20的奇数
消费者可以消费缓冲区1的产品,偶数消费者可消费缓冲区2的产品。 (4)为21--30号的生产者消费者线程只建立一块共享内存21号,21--30号生产者生产的产品都放入21号缓冲区,所有的消费者线程只要链接上21号共享内存,就可以消费21--30号生产者生产的产品。
用于控制线程是否结束的方法是:设置一个全局变量t,在生产者线程里进行t++,在生产者线程里当t达到10时(注:为了很好的测试程序,本应该在生产者生产30个产品时菜结束线程,这里设置成了10),就break跳出while()循环,这样线程自然就终止。同样在消费者线程里,当t达到10时,这里不用t++,就跳出while()循环,消费者线程自然就终止。这样设计满足了,当生产者生产30个产品时就终止生产者线程,生产者线程终止消费者线程也得终止的要求。
生产者从文件so.txt读取数据进行生产,这个文件里的数据是一连串的字符从a--z的组合,没有空格或其他字符。文件内容的格式没有特殊要求。
2.2函数说明
创建线程函数:参数tida30是
线程号,produce30是线程30生产者函数。
消费者线程
其他线程与以上的两个线程函数功能一样,只是变量不同。
等待函数,当满足一定条件时就会阻塞线
程,而激活另一个线程
触发函数,当满足一定条件时就会激活一个线程
建立共享内存函数:在进程里创
建一块共享内存
链接共享内存函数:参数shmid19是共享内存标识号,
此函数将线程连接到指定的共享内存。
三.设计
3.1设计环境
此设计不面向任何用户,只是一个测试用例;没有涉及网络通信; 此设计意在验证多个线程的并发执行,会有什么结果,线程是如何并发执行的,并发执行的线程与什么有关。线程间的互斥采用什么机制,同步采用什么机制,线程间如何通信,通信的机制是什么。此设计可以加深对线程的同步互斥以及通信的认识和理解。
3.3详细设计
消费者 comsume() 流程图:
开始
选择消费缓冲区,链接共享内存
Count-否 t=11 进入临界区 否 Count=0 否
是
是 阻 塞 消 费 者 线 程,激 活 生 产 者 线程
消 费 产品
Count<3 是
激活 生产 者线 程 Break;
结束
实现思路:
在main里创建30对线程,30个生产者,30个消费者。每对生产者消费者线程对应一对生产者消费者函数produce()和comsume();
生产者函数的实现:先链接对应的共享内存缓冲区,打开文件;设置全局变量count用于控制生产者线程的阻塞与消费者线程激活。当count=4时,意味着生产者生产了3个产品但是消费者没有消费,这时调用pthread_c …… 此处隐藏:2698字,全部文档内容请下载后查看。喜欢就下载吧 ……
上一篇:六人抢答器EDA课设报告