




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、共京双工人季Beijing fnxtiiiiie rj/ 丁上仁内“仞加力,本科实验报告实验名称:操作系统原理实验(读者写者问题)课程名称:操作系统原理实验时间:2015.10.30任课教师:王耀威实验地点:10#102实验教师:苏京霞实验类型:原理验证口综合设计自主创新学生XX:孙嘉明学级:1120121474/05611202组号:学院:信息与电子学院同组搭档:专业:信息对抗技术成绩:信息与电子学院MNML Cf INFMMATIOH MC实验二:读者写者问题一、实验目的1.通过编写和调试程序以加深对进程、线程管理方案的理解;2,熟悉Windows多线程程序设计方法;二、实验要求在Wind
2、ows环境下,创建一个控制台进程,此进程包含n个线程。用这n个线程来表示n个读者或写者。每个线程按相应测试数据文件(后面介绍)的要求进行读写操作。用信号量机制分别实 现读者优先和写者优先问题。读者-写者问题的读写操作限制(包括读者优先和写者优先)1)写-写互斥:不能有两个写者同时进行写操作2)读-写互斥:不能同时有一个线程在读,而另一个线程在写。3)读-读允许:可以有一个或多个读者在读。读者优先的附加限制:如果读者申请进行读操作时已有另一个读者正在进行读操作,则该读者 可直接开始读操作。运行结果显示要求:要求在每个线程创建、发出读写申请、开始读写操作和结束读写操作时分 别显示一行提示信息,以确
3、定所有处理都遵守相应的读写操作限制。测试数据文件包括 n行测试数据,分别描述创建的n个线程是读者还是写者,以及读写操作的开始时间和持续时间。 每行测试数据包括四个字段,每个字段间用空格分隔。 第1个字段为正整数,表示线程的序号。第2个字段表示线程的角色, R表示读者,W表示写者。第3个字段为一个正数, 表示读写开始时间:线程创建后,延迟相应时间(单位为秒)后发出对共享资源的读写申请。第4个字段为一个正数,表示读写操作的延迟时间。当线程读写申请成功后,开始对共享资源进行读写 操作,该操作持续相应时间后结束,释放该资源。下面是一个测试数据文件的例子(在记事本手工录入数据):1 R 3 52 W 4
4、 53 R 5 24 R 6 55 W 5.1 3三、实验环境硬件设备:个人计算机。系统软件:windows操作系统,Visual C+6.0编译环境。四、实验原理读者写者问题,可以这样的描述,有一群写者和一群读者,写者在写同一本书,读者也在读这 本书,多个读者可以同时读这本书,但是,只能有一个写者在写书,并且,读者比写者优先,也就 是说,读者和写者同时提出请求时,读者优先。当读者提出请求时需要有一个互斥操作,另外,需 要有一个信号量 S来当前是否可操作。信号量机制是支持多道程序的并发操作系统设计中解决资源共享时进程间的同步与互斥的重要机制,而读者写者则是这一机制的一个经典X例。在程序文件根目
5、录下创建一个thread.dat文件,存放读者写者信息,完成读者优先和写者优先的过程。五、实验结果程序界面:上!悖习大四上建作妻蜿案检庭受二否夙*bug'Cppl,旬& 一!回I-W请输出d. 2 or 3> :使用的测试文件如下:5 W 5.1 3读者优先结果:旧、学习状四上健作案魂咬脸。.留送始文文第文始文外 已已已已已发开重开发读茸号开写防 > > A A > > > > > A A > > > > > > > > >出自 1234511233s 4 4-314225 S
6、+TM <<<<<<<<<<<<<<<<<<< <- tt 纱转续纵续续续纵然线线纵线线线线线线线线u 者者者者者者者者者者者者4Hp者者者者 诲读房话昆读整r善由读读遗M与写写所AJeR .*£.-jP .fer- IF 1SF 佬1荽, 1 糜>1” 一写者优先结果:"E:学习状四上限作案猛寞窗写者优先读者壬请求 七二读春线读文件结束所有读者写者均元按任意犍批续六、程序代码# include "windows.h"# incl
7、ude <conio.h># include <stdlib.h># include <fstream.h># include <io.h># include <string.h>读者/写者/每秒时钟中断数目/最大线程数目/最大数据文件数目/字符串长度读者数目/写者数目# include <stdio.h># define READER 'R'# define WRITER W# define INTE_PER_SEC 1000# define MAX_THREAD_NUM 64# define MAX_F
8、ILE_NUM 32# define MAX_STR_LEN 32int readcount = 0;int writecount = 0;CRITICAL_SECTION RP_Write; 临界区CRITICAL_SECTION cs_Write;struct Threadinfo(int serial;char entity;double delay;double persist;CRITICAL_SECTION cs_Read;/线程序号/线程类别(判断是读者线程还是写者线程)/线程延迟/线程读写操作持续时间/读者优先-读者线程/ p:读者线程信息void RP_ReaderThrea
9、d(void* p)(/互斥变量HANDLE h_Mutex;h_Mutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex_for_readcount");DWORD wait_for_mutex;/等待互斥变量所有权DWORD m_delay;/延迟时间DWORD m_persist;/读文件持续时间int m_serial;/线程序号/从参数中获得信息m_serial = ( (Threadinfo*) (p) ) -> serial;m_delay = (DWORD) ( ( (Threadinfo*) (p) ) -&
10、gt; delay*INTE_PER_SEC); m_persist = (DWORD) ( ( (Threadinfo*) (p) ) -> persist*INTE_PER_SEC);Sleep(m_delay) ;/ 延迟等待printf("读者线程 <%d>发送读文件请求.n" , m_serial);/等待互斥信号,保证对readcount的访问、修改互斥wait_for_mutex = WaitForSingleObject (h_Mutex, -1);/读者数目增加 readcount +;if (readcount = 1)(/第一个读者,
11、等待资源 EnterCriticalSection(&RP_Write);)ReleaseMutex(h_Mutex) ;/ 释放互斥信号/读文件printf("读者线程 <%d>开始读文件.n" , m_serial);Sleep(m_persist);/退出线程printf("读者线程 <%d>读文件结束.n" , m_serial);/等待互斥信号,保证对readcount的访问、修改互斥wait_for_mutex = WaitForSingleObject(h_Mutex, -1);/读者数目减少 readcou
12、nt -;if (readcount = 0)(/如果所有读者读完,唤醒写者 LeaveCriticalSection(&RP_Write);)ReleaseMutex(h_Mutex) ;/ 释放互斥信号)/读者优先-写者线程/ p:写者线程信息/延迟时间/写文件持续时间/线程序号void RP_WriterThread(void* p) (DWORD m_delay;DWORD m_persist;int m_serial;/从参数中获得信息m_serial = ( (Threadinfo*) (p) ) -> serial;m_delay = (DWORD) ( ( (Th
13、readinfo* ) (p) ) -> delay * INTE_PER_SEC);m_persist = (DWORD) ( ( (Threadinfo* ) (p) ) -> persist * INTE_PER_SEC);Sleep(m_delay) ;/ 延迟等待printf("写者线程 <%d>发送写文件请求.n" , m_serial);/等待资源EnterCriticalSection(&RP_Write);/写文件printf("写者线程 <%d>开始写文件.n" , m_serial);Sl
14、eep(m_persist);/退出线程printf("写者线程 <%d>写文件结束.n" , m_serial);/释放资源LeaveCriticalSection(&RP_Write);)/读者优先处理函数/ file:文件名/线程数目/线程ID/等待所有线程结束void ReaderPriority(char * file) (DWORD n_thread = 0;DWORD thread_ID;DWORD wait_for_all;/互斥对象HANDLE h_Mutex;h_Mutex = CreateMutex(NULL, FALSE, &qu
15、ot;mutex_for_readcount");/线程对象的数组HANDLE h_Thread MAX_THREAD_NUM;ThreadInfo thread_infoMAX_THREAD_NUM;/ 初始化 readcount/初始化临界区/打开文件readcount = 0;InitializeCriticalSection(&RP_Write); ifstream inFile;inFile.open(file); printf("读者优先:n n");while (inFile)(读入每一个读者、写者的信息inFile >> thr
16、ead_infon_thread.serial;inFile >> thread_infon_thread.entity;inFile >> thread_infon_thread.delay;inFile >> thread_infon_thread + .persist;inFile.get();n_thread-;for (int i = 0; i < (int) (n_thread); i +)if (thread_infoi.entity = READER | thread_infoi.entity = 'R' )/创建读者线
17、程h_Threadi = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_infoi , 0, &thread_ID);printf("读者线程 <%d> 已创建.n" , thread_infoi.serial);else /创建写者线程h_Threadi = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_infoi , 0, &thre
18、ad_ID);printf("写者线程 <%d> 已创建.n" , thread_infoi.serial); /等待所有线程结束wait_for_all = WaitForMultipleObjects(n_thread, h_Thread, TRUE, -1);printf("所有读者写者均完成操作.n");/写者优先-读者线程/ p:读者线程信息void WP_ReaderThread(void * p) /互斥变量HANDLE h_Mutex1;h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS, FALSE,
19、 "mutexl");HANDLE h_Mutex2;h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex2");DWORD wait_for_mutex1;/等待互斥变量所有权/延迟时间DWORD wait_for_mutex2;DWORD m_delay;DWORD m_persist;/读文件持续时间int m_serial;/ 线程序号/从参数中获得信息m_serial = ( (Threadinfo* ) (p) ) -> serial;m_delay = (DWORD) ( ( (Th
20、readinfo* ) (p) ) -> delay * INTE_PER_SEC);m_persist = (DWORD) ( ( (Threadinfo* ) (p) ) -> persist * INTE_PER_SEC);Sleep(m_delay) ;/ 延迟等待printf("读者线程 <%d>发送读文件请求.n" , m_serial);wait_for_mutex1 = WaitForSingleObject(h_Mutex1, -1);/进入读者临界区EnterCriticalSection(&cs_Read);/阻塞互斥对
21、象 mutex2,保证对readcount的访问、修改互斥 wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1) ; / 修改读者数目 readcount +;if (readcount = 1)(/如果是第一个读者,等待写者写完 EnterCriticalSection(&cs_Write);)ReleaseMutex(h_Mutex2) ;/ 释放互斥信号 mutex2/让其他读者进入临界区LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex1);/读文件printf(&qu
22、ot;读者线程 <%d>开始读文件.n" , m_serial);Sleep(m_persist);/退出线程printf("读者线程 <%d>读文件结束.n" , m_serial);/阻塞互斥对象 mutex2,保证对readcount的访问、修改互斥 wait_for_mutex2 = WaitForSingleObject(h_Mutex2, -1);readcount -;if (readcount = 0)(/最后一个读者,唤醒写者 LeaveCriticalSection(&cs_Write);)ReleaseMute
23、x(h_Mutex2) ;/ 释放互斥信号)/写者优先-写者线程/ p:写者线程信息void WP_WriterThread(void * p)/延迟时间/写文件持续时间/线程序号(DWORD m_delay;DWORD m_persist;int m_serial;DWORD wait_for_mutex3;/互斥对象HANDLE h_Mutex3;h_Mutex3 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "mutex3");/从参数中获得信息m_serial = ( (ThreadInfo* ) (p) ) -> serial;m
24、_delay = (DWORD) ( ( (ThreadInfo* ) (p) ) -> delay * INTE_PER_SEC); m_persist = (DWORD) ( ( (ThreadInfo* ) (p) ) -> persist * INTE_PER_SEC);Sleep(m_delay) ;/ 延迟等待printf("写者线程 <%d>发送写文件请求.n" , m_serial);/阻塞互斥对象 mutex3,保证对 writecount的访问、修改互斥 wait_for_mutex3 = WaitForSingleObject(
25、h_Mutex3, -1);writecount + ;修改写者数目if (writecount = 1)(/第一个写者,等待读者读完EnterCriticalSection(&cs_Read);)ReleaseMutex(h_Mutex3);/进入写者临界区EnterCriticalSection(&cs_Write);/写文件 printf("写者线程 <%d>开始写文件.n" , m_serial);Sleep(m_persist);/退出线程 printf("写者线程 <%d>写文件结束.n" , m_se
26、rial);/离开临界区LeaveCriticalSection(&cs_Write);/阻塞互斥对象 mutex3,保证对 writecount的访问、修改互斥 wait_for_mutex3 = WaitForSingleObject(h_Mutex3, -1);writecount -;if (writecount = 0)(写者写完,读者可以读LeaveCriticalSection(&cs_Read);)ReleaseMutex(h_Mutex3);) / / / / / / / / / / / / / / / / / / / / / / / / / / / / /
27、/ / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / /写者优先处理函数/ file:文件名void WriterPriority(char * file) (DWORD n_thread = 0;DWORD thread_ID;DWORD wait_for_all;/线程数目/线程ID/等待所有线程结束/互斥对象HANDLE h_Mutex1;h_Mutex1 = CreateMutex(NULL, FALSE, "mutexl");HANDLE h_Mute
28、x2;h_Mutex2 = CreateMutex(NULL, FALSE, "mutex2");HANDLE h_Mutex3;h_Mutex3 = CreateMutex(NULL, FALSE, "mutex3");/线程对象HANDLE h_ThreadMAX_THREAD_NUM;Threadinfo thread_infoMAX_THREAD_NUM;readcount = 0;/ 初始化 readcountwritecount = 0;/ 初始化 writecountInitializeCriticalSection(&cs_Wri
29、te);/ 初始化临界区InitializeCriticalSection(&cs_Read);ifstream inFile;inFile.open(file) ;/ 打开文件printf("写者优先:n n");while (inFile)(读入每一个读者、写者的信息inFile >> thread_infon_thread.serial;inFile >> thread_infon_thread.entity;inFile >> thread_infon_thread.delay;inFile >> thread
30、_infon_thread +.persist;inFile.get();)n_thread-;for (int i = 0; i < (int) (n_thread) ; i +)(if (thread_infoi.entity = READER | thread_infoi.entity = 'R') (/创建读者线程h_Threadi = CreateThread(NULL, 0,(LPTHREAD_START_ROUTINE) (WP_ReaderThread), &thread_infoi , 0, &thread_ID);printf("读者线程 <%d> 已创建.n" , thread_infoi.serial); else (/创建写者线程h_Thr
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 会计初级自考试题及答案
- 2025年宠物健康在线问诊平台市场拓展策略与成功案例分析
- 河北省元月调研考试f题型及答案
- 2025年央行数字货币(CBDC)对传统金融机构的冲击与转型
- 公司专项安全培训课件
- 金融科技项目进度调整与风险控制方案2025
- 2025年研发投入论科技企业创新驱动策略分析方案
- 军事沙盘堆制详细课件
- 山区救援网2025年应急救援志愿者心理辅导策略分析
- “智能家居娱乐系统2025年初步分析方案”
- 小学四年级道德与法治上册教材分析
- 淋巴瘤基础知识
- GB/T 14038-2008气动连接气口和螺柱端
- 《计算机系统结构(第二版)》配套教学课件
- 胰十二指肠切除术课件
- 风险分级管控责任清单(市政道路工程)
- (临床治疗)继发性甲旁亢课件
- UNIT 1 LESSON 1 LIFESTYLES课件第一课时
- 投标文件标书采购类
- 传媒公司解约合同模板
- 陆上石油天然气长输管道建设项目初步设计安全专篇
评论
0/150
提交评论