- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统 实验 五 线程间的互斥与同步
实验 五 线程间的互斥与同步
实验学时:2学时
实验类型:验证、设计型
一、实验目的
理解POSIX线程(Pthread)互斥锁和POSIX信号量机制,学习它们的使用方法;编写程序,实现多个POSIX线程的同步控制。
二,实验内容
创建4个POSIX线程。其中2个线程(A和B)分别从2个数据文件(data1.txt和data2.txt)读取10个整数. 线程A和B把从文件中读取的逐一整数放入一个缓冲池. 缓冲池由n个缓冲区构成(n=5,并可以方便地调整为其他值),每个缓冲区可以存放一个整数。另外2个线程,C和D,各从缓冲池读取10数据。线程C、D每读出2个数据,分别求出它们的和或乘积,并打印输出。
提示:在创建4个线程当中,A和B是生产者,负责从文件读取数据到公共的缓冲区,C和D是消费者,从缓冲区读取数据然后作不同的计算(加和乘运算)。使用互斥锁和信号量控制这些线程的同步。不限制线程C和D从缓冲区得到的数据来自哪个文件。
在开始设计和实现之前,务必认真阅读课本6.8.4节和第6章后面的编程项目——生产者-消费者问题。
三,实验要求
按照要求编写程序,放在相应的目录中,编译成功后执行,并按照要求分析执行结果,并写出实验报告。
四,实验设计
1,功能设计
根据实验要求,主程序需要创建四个线程,两个线程负责从文件读取数据到缓冲区,两个线程负责将缓冲区的数据做数学运算。由于同一个进程中的各个线程共享资源,可以用一个二维数组的全局变量作为公共缓冲区,同时还需要一个整形全局变量size用来做数组的索引。读线程的运行函数打开不同的文件并从中读取数据到二维数组中,每次写入数组后size加一。运算线程从二维数组中读数并做运算,每次读数之前size减一。本题的关键在于如何使用信号量保证进程的同步与互斥。在运算线程从缓冲区读取之前缓冲区里必须有数,即任意时刻运算操作的执行次数必须小于等于读取操作的执行次数。同时应该保证两个读线程和两个运算线程两两互斥。由于以上分析,使用了四个信号量sem1,sem2,sem3和sem4。sem1保证线程1和线程2互斥,sem2保证线程3和线程4互斥,sem3保证线程3和线程4互斥,sem4保证线程4和线程1互斥。即这四个信号量使四个线程循环进行,从而保证了运行结果的正确性。
源代码及注释:
#include stdio.h
#include pthread.h
#include semaphore.h
#define NUM 200
int stack[NUM][2]; //公共缓冲区
int size=0; //初始化数组索引
sem_t sem1,sem2,sem3,sem4; //定义四个信号量
void read1(void){ //线程运行函数,负责从文件读取数据
FILE *fp=fopen(data0.txt,r); //以只读方式打开文件data1
while(!feof(fp)){
sem_wait(sem1); //减少信号量sem1
if(!fscanf(fp,%d %d,stack[size][0],stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(sem2); //增加信号量sem2
}
fclose(fp); //关闭文件
}
void read2(void){ //线程运行函数,负责从文件读取数据
FILE *fp=fopen(data1.txt,r); //以只读方式打开文件data2
while(!feof(fp)){
sem_wait(sem2); //减少信号量sem2
if(!fscanf(fp,%d %d,stack[size][0],stack[size][1]))return;
size++; //读两个数到公共缓冲区
sem_post(sem3); //增加信号量sem3
}
fclose(fp);
}
void plus1(void){ //线程运行函数,负责加运算
while(1){
sem_wait(sem3); //减少信号量sem3
if(size==0){return;}
size--;
printf(Plus:%d+%d=%d\n,stack[size][0],stack[size][1],stack[size][0]+stack[size][1]); //从公共缓冲区取数并进行加运算
sem_post(sem4); //增加信号量sem3
}
}
void multi2(void){
文档评论(0)