题 目
线程步方法解决生产者-消费者问题(ProducerConsumer Problem)
学 院
计算机科学技术学院
专 业
软件工程
班 级
姓 名
指导教师
年
月
日
目 录
目 录 1
课程设计务书 1
正 文 2
1设计目求 2
11设计目 2
12设计求 2
2设计思想系统台 2
21设计思想 2
22系统台语言 3
3详细算法描述 3
4源程序清单 6
5运行结果运行情况 9
6调试程 11
7总结 12
科生课程设计成绩评定表 13
课程设计务书
学生姓名: 专业班级:
指导教师: 工作单位: 计算机科学技术学院
题目 线程步方法解决生产者-消费者问题 (ProducerConsumer Problem)
初始条件:
1. 操作系统:Linux
2. 程序设计语言:C语言
3. 界缓区设20存储单元初值0放入/取出数项增序设定1-2020整型数
求完成务 (包括课程设计工作量技术求说明书撰写等具体求)
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设计目求
11设计目
通研究Linux线程机制信号量实现生产者消费者问题(ProducerConsumer Problem)发控制
12设计求
1)生产者/消费者产生线程设计正确步算法
2)生产者消费者该存储区进行操作时显示该存储区全部容
前指针位置生产者消费者线程定义标识符
3)生产者消费者两
4)生产者消费者间须享存储区进行操作函数代码
2设计思想系统台
21设计思想
问题中需Mutex两Semaphore
中Mutex锁定界区解决享数buffer互斥访问问题(生成者消费者)
需两Semaphore问题中两稀缺资源
第种非空种资源消费者间进行竞争
第二种非满种资源生产者间进行竞争
般说需锁定界区需Mutex种稀缺资源需Semaphore
稀缺资源分析想然稀缺资源定指享资源时候指线程会阻塞条件(进界区阻塞外)
生产者消费者问题中消费者会缓区空时阻塞非空种稀缺资源
需设置信号量consumer_semaphore初值设0
生产者会缓区满时阻塞非满种稀缺资源
需设置信号量producer_semaphore初值设bufferMAX_BUFFER
22系统台语言
课程设计Linux操作系统C语言完成工具GCC编译器VI编辑器
3详细算法描述
享数:
Semaphore buffer_mutex1
Semaphore producer_semaphoreMAX_BUFFER
Semaphore consumer_semaphore0
int buffer[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)
Consumebuffer[cn]
cn(cn+1)MAX_BUFFER
Signal(producer_semaphore)
Signal(buffer_mutex)
Sleep()
}
consumer线程处理函数流程图:
4源程序清单
户名:rj070126(IP:1921682254)
源程序名:homerj070126pcc
目标程序名:homerj070126pc
运行结果:homerj070126outputtxt
源程序清单:
#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 buffer[MAX_BUFFER] *difine the buffer *
int produce_pointer0consume_pointer0
sem_t producer_semaphoreconsumer_semaphorebuffer_mutex
pthread_t threads_p[NUM_THREADS_P] *producer*
pthread_t threads_c[NUM_THREADS_C] *consumer*
FILE* fd
void *producer_thread(void *tid)
void *consumer_thread(void *tid)
void showbuf()
void handler(){
int i
for(i0i
for(i0i
}
int main(){
int i
signal(SIGALRMhandler)
fdfopen(outputtxtw) *open a file to save the result*
sem_init(&producer_semaphore0MAX_BUFFER) *set the value of semaphores*
sem_init(&consumer_semaphore00)
sem_init(&buffer_mutex01)
for(i0i
*create the threads*
for(i0i
for(i0i
alarm(RUN_TIME) *set time to run*
*wait the threads to exit*
for(i0i
for(i0i
*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_ENABLENULL)
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)20consume_pointer)
sem_wait(&buffer_mutex)
buffer[produce_pointer]rand()20+1
produce_pointer(produce_pointer+1)20
if(produce_pointer0){ *if buffer was filled to the 19th*
printf(producerd pointer_p2d produced2d\n(int)tid19buffer[19])
fprintf(fdproducerd pointer_p2d produced2d\n(int)tid19buffer[19])
}
else{
printf(producerd pointer_p2d produced2d\n(int)tidproduce_pointer1buffer[produce_pointer1])
fprintf(fdproducerd pointer_p2d produced2d\n(int)tidproduce_pointer1buffer[produce_pointer1])
}
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_ENABLENULL)
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(consumerd pointer_c2d consumed2d\n(int)tidconsume_pointerbuffer[consume_pointer])
fprintf(fdconsumerd pointer_c2d consumed2d\n(int)tidconsume_pointerbuffer[consume_pointer])
buffer[consume_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(fdbuffer)
for(i0i
fprintf(fd2d buffer[i])
}
printf(\n\n)
fprintf(fd\n\n)
}
5运行结果运行情况
程序运行结果:
producer1 pointer_p 0 produced20
buffer20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer3 pointer_p 1 produced13
buffer20 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer2 pointer_p 2 produced 6
buffer20 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer4 pointer_p 3 produced14
buffer20 13 6 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer5 pointer_p 4 produced20
buffer20 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer2 pointer_c 0 consumed20
buffer 0 13 6 14 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer1 pointer_p 5 produced20
buffer 0 13 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer1 pointer_c 1 consumed13
buffer 0 0 6 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer3 pointer_c 2 consumed 6
buffer 0 0 0 14 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer4 pointer_c 3 consumed14
buffer 0 0 0 0 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer5 pointer_c 4 consumed20
buffer 0 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer3 pointer_p 6 produced 1
buffer 0 0 0 0 0 20 1 0 0 0 0 0 0 0 0 0 0 0 0 0
producer2 pointer_p 7 produced14
buffer 0 0 0 0 0 20 1 14 0 0 0 0 0 0 0 0 0 0 0 0
consumer3 pointer_c 5 consumed20
buffer 0 0 0 0 0 0 1 14 0 0 0 0 0 0 0 0 0 0 0 0
producer4 pointer_p 8 produced 6
buffer 0 0 0 0 0 0 1 14 6 0 0 0 0 0 0 0 0 0 0 0
consumer5 pointer_c 6 consumed 1
buffer 0 0 0 0 0 0 0 14 6 0 0 0 0 0 0 0 0 0 0 0
producer5 pointer_p 9 produced 8
buffer 0 0 0 0 0 0 0 14 6 8 0 0 0 0 0 0 0 0 0 0
consumer2 pointer_c 7 consumed14
buffer 0 0 0 0 0 0 0 0 6 8 0 0 0 0 0 0 0 0 0 0
consumer5 pointer_c 8 consumed 6
buffer 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0
producer1 pointer_p10 produced18
buffer 0 0 0 0 0 0 0 0 0 8 18 0 0 0 0 0 0 0 0 0
consumer1 pointer_c 9 consumed 8
buffer 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0 0 0 0 0 0
producer2 pointer_p11 produced10
buffer 0 0 0 0 0 0 0 0 0 0 18 10 0 0 0 0 0 0 0 0
producer4 pointer_p12 produced10
buffer 0 0 0 0 0 0 0 0 0 0 18 10 10 0 0 0 0 0 0 0
consumer4 pointer_c10 consumed18
buffer 0 0 0 0 0 0 0 0 0 0 0 10 10 0 0 0 0 0 0 0
producer3 pointer_p13 produced 3
buffer 0 0 0 0 0 0 0 0 0 0 0 10 10 3 0 0 0 0 0 0
consumer3 pointer_c11 consumed10
buffer 0 0 0 0 0 0 0 0 0 0 0 0 10 3 0 0 0 0 0 0
consumer2 pointer_c12 consumed10
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0
producer1 pointer_p14 produced 6
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 0 0 0 0 0
consumer1 pointer_c13 consumed 3
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 0 0 0 0 0
producer2 pointer_p15 produced18
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 18 0 0 0 0
consumer5 pointer_c14 consumed 6
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 0 0 0 0
producer1 pointer_p16 produced 6
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 0 0 0
producer3 pointer_p17 produced19
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 18 6 19 0 0
consumer1 pointer_c15 consumed18
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 0 0
producer5 pointer_p18 produced 7
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 19 7 0
consumer3 pointer_c16 consumed 6
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 0
producer4 pointer_p19 produced14
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 19 7 14
consumer5 pointer_c17 consumed19
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 14
consumer4 pointer_c18 consumed 7
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14
producer1 pointer_p 0 produced 4
buffer 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 14
consumer2 pointer_c19 consumed14
buffer 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
consumer1 pointer_c 0 consumed 4
buffer 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer2 pointer_p 1 produced15
buffer 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer3 pointer_p 2 produced13
buffer 0 15 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
producer2 pointer_p 3 produced 3
buffer 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
说明:
producer2指定义标号2producerpointer_p3指该producer指针produced3指该producerbuffer[3]里写入3buffer 0 15 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 指该producer进行写操作存储区容
6调试程
通次课程设计加深操作系统课程认识解操作系统中信号量解决生产者—消费者问题算法实现:信号量解决生产者—消费者问题时通界缓区(数组实现类似循环队列)生产者消费者联系起假定生产者消费者优先级相缓区未满生产者生产产品产品送入缓区类似缓区未空消费者缓区中走产品消费解决生产者消费者问题应该设置两资源信号量中表示空缓区数目producer_semaphore表示初始值界缓区SIZE_OF_BUFFER表示缓区中产品数目consumer_semaphore表示初始值0外界缓区界资源必须互斥需设置互斥信号量buffer_mutex起初值1生产者消费者问题中信号量实现两种功首先生产产品消费产品计数器计数器初始值利资源数 目(界缓区长度)次确保产品生产者消费者间动作步步器生产者生产产品时首先资源信号量producer_semaphore互斥信号量buffer_mutex进行wait操作申请资源果通话生产产品产品送入缓区然互斥信号量buffer_mutex资源信号量consumer_semaphore进行signal操作释放资源消费者消费产品时首先资源信号量consumer_semaphore互斥信号量buffer_mutex进行wait操作申请资源果通话缓区取出产品 消费掉然互斥信号量buffer_mutex资源信号量producer_semaphore进行signal操作释放资源
7总结
通次课程设计巩固线程编程方法信号量步进线程技巧次课程设计程序运行结果预期致说明该程序利解决生产者消费者问题实现次课程设计目
外体会深:门知识掌握仅学理知识远远够实际动手操 作相结合达功效短短课程设计结束专业知识更深理解更认识 实践重性理实践相结合达学效果特程序语言学
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档