操作系统 实验 五 线程间的互斥与同步.doc_第1页
操作系统 实验 五 线程间的互斥与同步.doc_第2页
操作系统 实验 五 线程间的互斥与同步.doc_第3页
操作系统 实验 五 线程间的互斥与同步.doc_第4页
操作系统 实验 五 线程间的互斥与同步.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验 五 线程间的互斥与同步实验学时: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 #include #include #define NUM 200int stackNUM2;/公共缓冲区int size=0;/初始化数组索引sem_t sem1,sem2,sem3,sem4;/定义四个信号量void read1(void)/线程运行函数,负责从文件读取数据FILE *fp=fopen(data0.txt,r);/以只读方式打开文件data1while(!feof(fp)sem_wait(&sem1);/减少信号量sem1if(!fscanf(fp,%d %d,&stacksize0,&stacksize1)return;size+;/读两个数到公共缓冲区sem_post(&sem2);/增加信号量sem2fclose(fp);/关闭文件void read2(void)/线程运行函数,负责从文件读取数据FILE *fp=fopen(data1.txt,r);/以只读方式打开文件data2while(!feof(fp)sem_wait(&sem2);/减少信号量sem2if(!fscanf(fp,%d %d,&stacksize0,&stacksize1)return;size+;/读两个数到公共缓冲区sem_post(&sem3);/增加信号量sem3fclose(fp);void plus1(void)/线程运行函数,负责加运算while(1)sem_wait(&sem3);/减少信号量sem3if(size=0)return;size-;printf(Plus:%d+%d=%dn,stacksize0,stacksize1,stacksize0+stacksize1);/从公共缓冲区取数并进行加运算sem_post(&sem4);/增加信号量sem3void multi2(void)/线程运行函数,负责乘运算while(1)sem_wait(&sem4);/减少信号量sem4if(size=0)return;size-;printf(Multiply:%d*%d=%dn,stacksize0,stacksize1,stacksize0*stacksize1);/从公共缓冲区取数并进行乘运算sem_post(&sem1);/增加信号量sem3int main(void)pthread_t t1,t2,t3,t4;/定义线程标识符sem_init(&sem1,0,1);/初始化信号量sem_init(&sem2,0,0);sem_init(&sem3,0,0);sem_init(&sem4,0,0);pthread_create(&t1,NULL,(void *)read1,NULL);/创建线程,绑定线程运行函数pthread_create(&t2,NULL,(void *)read2,NULL);pthread_create(&t3,NULL,(void *)plus1,NULL);pthread_create(&t4,NULL,(void *)multi2,NULL);pthread_join(t1,NULL);/等待线程运行结束2,数据结构信号量(semaphore):数据类型为结构 sem_t,本质上是一个长整型的数。公共缓冲区(stack):采用2维数组的方式实现(stackNUM2)。数组中的两列分别存储两个文件中的数据。该2维数组还有一个索引:size,指向2维数组的顶部。五,实验测试结果及分析实验截图:如图所示,加线程和乘线程从缓冲区读取数据,进行运算,并将运算结果输出。六,收获及体会在本次实验中,我学习了UNIX 类操作系统信号量机制,掌握了编写Linux 环境下利用信号量实现进程控制的方法及相关系统调用的使用方法。在编译的时候也遇到了一些问题,在读取时data0和data1时出

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论