欢迎来到天天文库
浏览记录
ID:41660868
大小:70.47 KB
页数:11页
时间:2019-08-29
《实验2详细指导》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实验二读者写者问题1.1实验要求创建一个控制台进程。此进程包含n个线程。用这n个线程來表示n个读者或写者。每个线程按相应测试数据文件(后面有介绍)的要求进行读写操作。用信号量机制分别实现读者优先和写者优先的读者■写者问题。读者•写者问题的读写操作限制(包括读者优先和写者优先):1)写•写互斥,即不能有两个写者同吋进行写操作。2)读■写互斥,即不能同时有一个线程在读,而另一个线程在写。3)读■读允许,即可以有一个或多个读者在读。读者优先的附加限制:如果一个读者巾请进行读操作时已冇另一个读者正在进行读操作,则该读者可直接开始读操作。写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待
2、访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。运行结果显示要求:耍求在每个线程创建、发出读写操作屮请、开始读写操作和结束读写操作时分别显示一行捉示信息,以确定所冇处理都遵守相应的读写操作限制。1.2实验环境windows2000/xp,visualC++1.3测试数据文件格式测试数据文件包括n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各个字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R表示读者,w表示写者。第三字段为-个正数,表示读写操作的开始时间:线程创建后,延迟相应时
3、间(单位为秒)后发出对共享资源的读写申请。第四字段为一个止数,表示读写操作的持续时间。当线程读写屮请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。1下面是一个测试数据文件的例子:R352W453R524R655W5.13由于牵涉格式的问题,最好在记事木中手工逐个键入数据,而不要拷贝粘贴数据,1.4试验分析可以将所有读者和所有写者分别存丁一个读者等待队列和一个写者等待队列中,每当读允许时,.就从读者队列中释放一个或多个读者线程进行读操作;每当写允许时,就从写者队列小释放…个写者进行写操作。1.读者优先读者优先指的是除非有写者在写文件,否则读者不需要等待。所以可以用一
4、个整型变量read_count记录当前的读者数目,用于确定是否需耍释放正在等待的写者线程(当read_count=0时,表明所有的读者读完,需要释放写者等待队列中的一个写者)。每一个读者开始读文件时,必须修改read_count变量。因此需要一个互斥对象mutex来实现对全局变量read_count修改时的互斥。另外,为了实现写•写互斥,需要增加一个临界区对象writeo当写者发出写请求时,必须申请临界区对象的所有权。通过这种方法,也可以实现读•写互斥,当read_count=l时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权。当读者拥有临界区的所有权时,写者阻塞在临界区对象wr
5、ite±0当写者拥有临界区的所有权时,第一个读者判断完“reacl_coum=l”后阻塞在write上,其余的读者由于等待对read.count的判断,阻塞在mutex上。2写者优先写者优先与读者优先类似。不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到來的读者不允许进行读操作。为此应当添加一个整型变量write_count,用于记录正在等待的写者的数目,当write_count=0时,才可以释放等待的读者线程队列。为了对全局变量write_count实现互斥,必须增加一个互斥对彖mutex3o为了实现写者优先,血当添加一个临界区对象read,当有写者在写
6、文件或等待时,读者必须阻塞在read上。读者线程除了耍对全局变量read.count实现操作上的互斥外,还必须有一个互斥对象对阻塞read这一过程实现互斥。这两个互斥对象分别命名为mutexl和mutex2o1.5相关API函数说明1•CreateThread函数功能:该函数创建一个在调用进程的地址空间中执行的线程。函数模型:HANDLECreateThread(LPSECURITY_ATTRIBUTESlpThreadAttributes,DWORDdwStackSize,LPTHREAD_START_ROUTINEIpStartAddress,LPVOIDIpParameter,DWORD
7、dwCreationFlag,LPDWORDlpThreadld);参数•lpThreadAttributes:扌旨向一个SCURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。若1pThreadAttributes为NULL,则句柄不能被继承。在windowsNT屮该结构的IpSecurityDescriptor成员定义了新进程的安全性描述符。若lpThreadAtt
此文档下载收益归作者所有