操作系统实验-线程:同步互斥问题分析.docx

操作系统实验-线程:同步互斥问题分析.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验五 实验目的 熟悉并掌握线程的操作 了解同步互斥问题,并解决简单的同步互斥问题 实验内容 利用线程同步机制,实现教材202页的生产者-消费者问题 在Linux环境下,创建一个进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者-写者问题。 读者-写者问题的读写操作限制(仅读者优先或写者优先): 1)写-写互斥,即不能有两个写者同时进行写操作。 2)读-写互斥,即不能同时有一个线程在读,而另一个线程在写。 3)读-读允许,即可以有一个或多个读者在读。 读者优先的附加限制:如果一个读者申请进行读操作时已有另一个读者正在进行读操作,则该读者可直接开始读操作。 写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。 运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确定所有处理都遵守相应的读写操作限制。 设计和编码 本实验用到的理论知识 Linux下线程的创建及终止撤销, 信号量的使用,文件的读写,Linux下c++编程的基本知识 算法设计 生产者-消费者问题 使用三个信号量: empty (以记录有多少空位)、full (以记录有多少满位)以及mutex (二进制信号量或互斥信号量,以保护对缓冲插入与删除的操作)。empty 与full 将采用标准计数信号量,而mutex 将采用二进制信号量。生产者与消费者作为独立线程,在empty、full、mutex 的同步前提下,对缓冲进行插入与删除。 用函数insert_item()与函数remove_item()来同步互斥生产者与消费者。调用insert_item(),当有空位时就插入随机数,返回插入成功(返回0),否则返回插入失败(返回-1);调用remove_item(),当还有产品时,就移去一个产品,返回消费成功(返回0),否则返回消费失败(返回-1)。 主函数有三个参数,一次为主函数睡眠时间,生产者线程数量,消费者线程数量 生产者不断交替执行:睡眠一段随机时间后,向缓冲区插入一个随机数。随机数用rand()函数生成。消费者也睡眠随机时间,在醒后会试图从缓冲区取出一项。生产者与消费者执行时用mutex信号量实现操作的互斥。 读者-写者问题中的读者优先 用整型变量readcount记录读者数目。使用三个信号量: mutex(确保更新readcount时的互斥)、wrt(保持写者线程写数据时的互斥,并且一旦有读者进程申请读(在此之前readcount=0),那么就申请wrt,直到readcount=0才释放wrt)。Mutex与wrt均采用二进制信号量。读者与写者作独立线程 只要读者线程申请要读后,可以直接进行读的操作。而当写者线程申请要写时必须等到没有读者线程在读(即wrt被释放)才能开始写,并且同一个时间只能有一个写者线程在写 data.txt文件中存储数据,第一个数字为读者线程与写者线程的总数。后面的数据有n行。分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,W表示写者。第三字段为一个正数,表示读写操作的开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。例如: 3 1 R 3 4 2 W 2 5 3 R 4 2 读者-写者问题中的写者优先 和读者优先相比,增加整型变量writecount来记录写者线程的数目,增加信号量rd(当有写者在写文件或等待时,使得读者阻塞在rd上)和mutex2(保证更新writecount时的互斥)。其中readcount变为用来记录正在读的读者线程数目。一旦有写者进程申请写(在此之前writecount=0),则申请rd,知道writecount才释放rd。一旦有读者进程通过rd的阻塞(在此之前readcount=0),则表示读者进程已经在读了,这是就申请wrt,保证读写的互斥,直到readcount=0再释放wrt。其他与读者优先的程序基本上一样。 编码 生产者-消费者程序(pc.cpp) #include

文档评论(0)

***** + 关注
实名认证
内容提供者

我是自由职业者,从事文档的创作工作。

1亿VIP精品文档

相关文档