用多线程同步方法解决生产者消费者问题操作系统课设.docx
- 文档编号:2374056
- 上传时间:2022-10-29
- 格式:DOCX
- 页数:15
- 大小:51.11KB
用多线程同步方法解决生产者消费者问题操作系统课设.docx
《用多线程同步方法解决生产者消费者问题操作系统课设.docx》由会员分享,可在线阅读,更多相关《用多线程同步方法解决生产者消费者问题操作系统课设.docx(15页珍藏版)》请在冰豆网上搜索。
用多线程同步方法解决生产者消费者问题操作系统课设
学号:
课程设计
题目
用多线程同步方法解决生产者-消费者问题(Producer-ConsumerProblem)
学院
计算机科学与技术学院
专业
软件工程
班级
姓名
指导教师
年
月
日
目录
目录1
课程设计任务书1
正文2
1.设计目的与要求2
1.1设计目的2
1.2设计要求2
2.设计思想及系统平台2
2.1设计思想2
2.2系统平台及使用语言3
3.详细算法描述3
4.源程序清单6
5.运行结果与运行情况9
6.调试过程11
7.总结12
本科生课程设计成绩评定表13
课程设计任务书
学生姓名:
专业班级:
指导教师:
工作单位:
计算机科学与技术学院
题目:
用多线程同步方法解决生产者-消费者问题(Producer-ConsumerProblem)
初始条件:
1.操作系统:
Linux
2.程序设计语言:
C语言
3.有界缓冲区内设有20个存储单元,其初值为0。
放入/取出的数据项按增序设定为1-20这20个整型数。
要求完成的主要任务:
(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)
1.技术要求:
1)为每个生产者/消费者产生一个线程,设计正确的同步算法
2)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的当前全部内容、当前指针位置和生产者/消费者线程的自定义标识符。
3)生产者和消费者各有两个以上。
4)多个生产者或多个消费者之间须共享对缓冲区进行操作的函数代码。
2.设计说明书内容要求:
1)设计题目与要求
2)总的设计思想及系统平台、语言、工具等。
3)数据结构与模块说明(功能与流程图)
4)给出用户名、源程序名、目标程序名和源程序及其运行结果。
(要注明存储各个程序及其运行结果的主机IP地址和目录。
)
5)运行结果与运行情况
(提示:
(1)有界缓冲区可用数组实现。
(2)编译命令可用:
cc-lpthread-o 目标文件名 源文件名
(3)多线程编程方法参见附件。
)
3.调试报告:
1)调试记录
2)自我评析和总结
上机时间安排:
18周一~五08:
0-12:
00
指导教师签名:
年月日
系主任(或责任教师)签名:
年月日
正文
1.设计目的与要求
1.1设计目的
通过研究Linux的线程机制和信号量实现生产者消费者问题(Producer-ConsumerProblem)的并发控制。
1.2设计要求
1)为每个生产者/消费者产生一个线程,设计正确的同步算法
2)每个生产者/消费者对该存储区进行操作后,即时显示该存储区的全部内容、当
前指针位置和生产者/消费者线程的自定义标识符。
3)生产者和消费者各有两个以上。
4)多个生产者/消费者之间须共享对存储区进行操作的函数代码。
2.设计思想及系统平台
2.1设计思想
在本问题中,共需要一个Mutex和两个Semaphore.
其中,Mutex是用来锁定临界区的,以解决对共享数据buffer的互斥访问问题(无论是对生成者还是对消费者);
我们共需要两个Semaphore,这是因为在本问题中共有两个稀缺资源.
第一种是"非空"这种资源,是在消费者之间进行竞争的.
第二种是"非满"这种资源,是在生产者之间进行竞争的.
所以,一般来说,需要锁定临界区,就需要Mutex;有几种稀缺资源就需要几个Semaphore.
对稀缺资源的分析不能想当然.稀缺资源不一定是指被共享的资源,很多时候是指线程会被阻塞的条件(除了要进临界区被阻塞外).
在生产者消费者问题中,消费者会在缓冲区为空时被阻塞,所以"非空"是一种稀缺资源;
需要设置一个信号量consumer_semaphore,初值设为0;
生产者会在缓冲区为满时被阻塞,所以"非满"也是一种稀缺资源.
需要设置一个信号量producer_semaphore,初值设为buffer的大小MAX_BUFFER
2.2系统平台及使用语言
本课程设计在Linux操作系统下,使用C语言完成。
用到的工具主要有GCC编译器和VI编辑器。
3.详细算法描述
共享数据:
Semaphorebuffer_mutex=1;
Semaphoreproducer_semaphore=MAX_BUFFER;
Semaphoreconsumer_semaphore=0;
intbuffer[MAX_BUFFER];
Producer线程的处理函数:
while
(1){
Wait(producer_semaphore);
Wait(buffer_mutex);
Buffer[pn]=product;
pn=(pn+1)%MAX_BUFFER;
Signal(consumer_semaphore);
Signal(buffer_mutex);
Sleep();
}
producer线程的处理函数流程图如下:
consumer线程的处理函数:
while
(1){
Wait(consumer_semaphore);
Wait(buffer_mutex);
Consume=buffer[cn];
cn=(cn+1)%MAX_BUFFER;
Signal(producer_semaphore);
Signal(buffer_mutex);
Sleep();
}
consumer线程的处理函数流程图如下:
4.源程序清单
用户名:
rj070126(IP:
192.168.2.254)
源程序名:
/home/rj070126/pc.c
目标程序名:
/home/rj070126/pc
运行结果:
/home/rj070126/output.txt
源程序清单如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#defineNUM_THREADS_P5/*definethenumberofproducer*/
#defineNUM_THREADS_C5/*definethenumberofconsumer*/
#defineMAX_BUFFER20/*definethenumberofbuffer*/
#defineRUN_TIME20/*definetheruntime*/
intbuffer[MAX_BUFFER];/*difinethebuffer*/
intproduce_pointer=0,consume_pointer=0;
sem_tproducer_semaphore,consumer_semaphore,buffer_mutex;
pthread_tthreads_p[NUM_THREADS_P];/*producer*/
pthread_tthreads_c[NUM_THREADS_C];/*consumer*/
FILE*fd;
void*producer_thread(void*tid);
void*consumer_thread(void*tid);
voidshowbuf();
voidhandler(){
inti;
for(i=0;i pthread_cancel(threads_p[i]); for(i=0;i pthread_cancel(threads_c[i]); } intmain(){ inti; signal(SIGALRM,handler); fd=fopen("output.txt","w");/*openafiletosavetheresult*/ sem_init(&producer_semaphore,0,MAX_BUFFER);/*setthevalueofsemaphores*/ sem_init(&consumer_semaphore,0,0); sem_init(&buffer_mutex,0,1); for(i=0;i buffer[i]=0;/*initiatethebuffer*/ /*createthethreads*/ for(i=0;i pthread_create(&threads_p[i],NULL,(void*)producer_thread,(void*)(i+1)); for(i=0;i pthread_create(&threads_c[i],NULL,(void*)consumer_thread,(void*)(i+1)); alarm(RUN_TIME);/*settimetorun*/ /*waitthethreadstoexit*/ for(i=0;i pthread_join(threads_p[i],NULL); for(i=0;i pthread_join(threads_c[i],NULL); /*destroythesemaphores*/ sem_destroy(&producer_semaphore); sem_destroy(&consumer_semaphore); sem_destroy(&buffer_mutex); fclose(fd); return0; } void*producer_thread(void*tid){ /*thethreadcanbecanceledbyotherthread*/ pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL); while (1){ sem_wait(&producer_semaphore); srand((int)time(NULL)*(int)tid); sleep(rand()%2+1);/*oneortwosecondstoproduce*/ while((produce_pointer+1)%20==consume_pointer); sem_wait(&buffer_mutex); buffer[produce_pointer]=rand()%20+1; produce_pointer=(produce_pointer+1)%20; if(produce_pointer==0){/*ifbufferwasfilledtothe19th*/ printf("producer: %dpointer_p: %2dproduced: %2d\n",(int)tid,19,buffer[19])
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多线程 同步 方法 解决 生产者 消费者 问题 操作系统