读者写者实验报告Word文档格式.docx

上传人:b****5 文档编号:17479615 上传时间:2022-12-06 格式:DOCX 页数:12 大小:17.54KB
下载 相关 举报
读者写者实验报告Word文档格式.docx_第1页
第1页 / 共12页
读者写者实验报告Word文档格式.docx_第2页
第2页 / 共12页
读者写者实验报告Word文档格式.docx_第3页
第3页 / 共12页
读者写者实验报告Word文档格式.docx_第4页
第4页 / 共12页
读者写者实验报告Word文档格式.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

读者写者实验报告Word文档格式.docx

《读者写者实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《读者写者实验报告Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。

读者写者实验报告Word文档格式.docx

三、实验原理

1).读者优先

读者优先指的是除非有写者在写文件,否则读者不需要等待。

所以可以用一个整型变量read_count记录当前的读者数目,用于确定是否需要释放正在等待的写者线程(当read_count=O时,表明所有的读者读完,需要释放写者等待队列中的一个写者)。

每一个读者开始读文件时,必须修改read_count变量。

因此需要一个互斥对象mutex来实现对全局变量read_count修改时的互斥。

另外,为了实现写-写互斥,需要增加一个临界区对象write。

当写者发出写请求时,必须申请临界区对象的所有权。

通过这种方法,也可以实现读-写互斥,当read_count=l时(即第一个读者到来时),读者线程也必须申请临界区对象的所有权。

当读者拥有临界区的所有权时,写者阻塞在临界区对象write上。

当写者拥有临界区的所有权时,第一个读者判断完"

read_count==1"

后阻塞在write上,其余的读者由于等待对read_count的判断,阻塞在mutex上。

2).写者优先

写者优先与读者优先类似;

不同之处在于一旦一个写者到来,它应该尽快对文件进行写操作,如果有一个写者在等待,则新到来的读者不允许进行读操作。

为此应当添加一个整型变量write_count,用于记录正在等待的写者的数目,当write_count=O时,才可以释放等待的读者线程队列。

为了对全局变量write_count实现互斥,必须增加一个互斥对象mutex3。

为了实现写者优先,应当添加一个临界区对象read,当有写者在写文件或等

待时,读者必须阻塞在read上。

·

读者线程除了要对全局变量read_count实现操作上的互斥外,还必须有一个互斥对象对阻塞,read这一过程实现互斥。

这两个互斥对象分别命名为mutex1和mutex2。

四、实验过程

在Windows2000环境下,创建一个控制台进程。

用VC++实现。

结构:

头文件

定义全局变量

RP_ReaderThread()读者优先---读者线程

RP_WriterThread()读者优先---写者线程

ReaderPriority()读者优先处理函数

WP_ReaderThrea()写者优先---读者线程

WP_WriterThread()写者优先---写者线程

WriterPriority()写者优先处理函数

主函数:

包含对dat文件的读取以及函数的调用。

代码:

附录

五、实验结果

界面:

测试数据:

2W45

3R52

4R65

5W5.13

结果

读者优先

写者优先

六、实验心得体会

通过对读者写者问题的编程,对线程有了更深的了解,希望在后面的学习中懂得更多。

七、参考文献

老师提供的资料,以及互联网查阅。

八、附录

#include"

windows.h"

#include<

conio.h>

stdlib.h>

fstream.h>

io.h>

string.h>

stdio.h>

#include"

winbase.h"

#defineREADER'

R'

//读者

#defineWRITER'

W'

//写者

#defineINTE_PER_SEC1000//每秒时钟中断的数目

#defineMAX_THREAD_NUM64//最大线程数

intnReaderCnt=0;

//读者计数

intnWriterCnt=0;

//写者计数

HANDLEhWrite=:

:

CreateSemaphore(NULL,1,1,NULL);

//写开始信号

HANDLEhRead=:

//读开始信号

HANDLEhRCMutex=:

CreateMutex(NULL,FALSE,NULL);

HANDLEhWCMutex=:

HANDLEhReadMutex=:

//从测试数据文件中获取的线程信息

structThreadInfo

{

ThreadInfo()

{

nSerialNo=0;

cType='

^'

;

dDelayTime=0.0;

dOpeTime=0.0;

}

intnSerialNo;

//线程序号

charcType;

//线程类别

doubledDelayTime;

//线程延迟时间

doubledOpeTime;

//线程读写操作时间

};

//读者优先---读者线程

//P:

读者线程信息

voidRP_ReaderThread(void*p)

intnSerialNo=((ThreadInfo*)(p))->

nSerialNo;

//从文件中读取线程序号

DWORDdwReadTime=(DWORD)(((ThreadInfo*)(p))->

dOpeTime*INTE_PER_SEC);

DWORDdwDelay=(DWORD)(((ThreadInfo*)(p))->

dDelayTime*INTE_PER_SEC);

Sleep(dwDelay);

printf("

Readerthread%dsentsthereadingrequire.\n"

nSerialNo);

WaitForSingleObject(hRCMutex,INFINITE);

nReaderCnt++;

if(nReaderCnt==1)

WaitForSingleObject(hWrite,INFINITE);

ReleaseMutex(hRCMutex);

printf("

Readerthread%dbeginstoreadfile.\n"

nSerialNo);

Sleep(dwReadTime);

Readerthread%dfinishedreadingfile.\n"

nReaderCnt--;

if(nReaderCnt==0)

ReleaseSemaphore(hWrite,1,NULL);

}

//读者优先---写者线程

写者线程信息

voidRP_WriterThread(void*p)

//从参数中获得信息

DWORDdwWriteTime=(DWORD)(((ThreadInfo*)(p))->

Writethread%dsentsthewritingrequire.\n"

Writerthread%dbeginstowritetothefile.\n"

Sleep(dwWriteTime);

Writethread%dfinishedwritingtothefile.\n"

//读者优先处理函数

//file:

文件名

voidReaderPriority(char*file)

intnThreadCnt=0;

DWORDdwThreadID=0;

nReaderCnt=0;

//初始化读写者计数

HANDLEhThreads[MAX_THREAD_NUM];

ThreadInfooThreadInfo[MAX_THREAD_NUM];

ifstreaminFile;

inFile.open(file);

ReaderPriority:

\n\n"

);

while(inFile)

//读入每一个读者,写者的信息

inFile>

>

oThreadInfo[nThreadCnt].nSerialNo;

oThreadInfo[nThreadCnt].cType;

oThreadInfo[nThreadCnt].dDelayTime;

oThreadInfo[nThreadCnt].dOpeTime;

if('

!

=oThreadInfo[nThreadCnt].cType)

nThreadCnt++;

inFile.get();

//创建线程

for(inti=0;

i<

nThreadCnt;

i++)

if((oThreadInfo[i].cType==READER)||(oThreadInfo[i].cType=='

r'

))

hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_ReaderThread),//创建读者进程

&

oThreadInfo[i],CREATE_SUSPENDED,&

dwThreadID);

else

hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),//创建写线程

for(i=0;

ResumeThread(hThreads[i]);

WaitForMultipleObjects(nThreadCnt,hThreads,TRUE,INFINITE);

Allreaderandwriterhavefinishedoperating.\n"

//写者优先---读者线程

voidWP_ReaderThread(void*p)

//从参数中得到信息

WaitForSingleObject(hReadMutex,INFINITE);

WaitForSingleObject(hRead,INFINITE);

if(nReaderCnt==1)

ReleaseMutex(hRCMutex);

ReleaseSemaphore(hRead,1,NULL);

ReleaseMutex(hReadMutex);

//写者优先---写者线程

voidWP_WriterThread(void*p)

nSerialNo;

Writerthread%dsentsthewritingrequire.\n"

WaitForSingleObject(hWCMutex,INFINITE);

nWriterCnt++;

if(nWriterCnt==1)

ReleaseMutex(hWCMutex);

Writerthread%dfinishedwritingtothefile.\n"

nWriterCnt--;

if(nWriterCnt==0)

//写者优先处理函数

voidWriterPriority(char*file)

DWORDdwThreadID;

nReaderCnt=0;

nWriterCnt=0;

inFile.open(file);

Writerpriority:

);

while(inFile)

for(inti=0;

i<

i++)//创建线程

if((oThreadInfo[i].cType==READER)||(oThreadInfo[i].cType=='

hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_ReaderThread),//创建读者进程

else

hThreads[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WP_WriterThread),

oThreadInfo[i],CREATE_SUSPENDED,&

dwThreadID);

intmain(intargc,char*argv[])

charch;

while(true)

*************************************\n"

1.ReaderPriority\n"

2.WriterPriority\n"

3.ExittoWindows\n"

Enteryourchoice1,2,3:

"

do{

ch=(char)_getch();

}while(ch!

='

1'

&

ch!

2'

3'

system("

cls"

if(ch=='

return0;

elseif(ch=='

ReaderPriority("

thread.dat"

WriterPriority("

\nPressAnyKeytoCoutinue:

"

_getch();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 法语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1