任务5- 事件对象解决读写者问题Word格式文档下载.docx
《任务5- 事件对象解决读写者问题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《任务5- 事件对象解决读写者问题Word格式文档下载.docx(7页珍藏版)》请在冰豆网上搜索。
S1=1,S2=0intC;
thecountofrecource
wait():
Wait(S1);
C--;
if(C<
0){
signal(S1);
wait(S2);
}
signal(S2);
signal():
wait(S1);
C++;
=0) {
else{
读者-写者问题算法如下:
Writer:
wait(Wmutex);
//dowritingsignal(Wmutex);
Reader:
wait(Rmutex);
if(Rcount==0){wait(Wmutex);
Rcount++;
signal(Rmutex);
//doreadingwait(Rmutex);
Rcount--;
if(Rcount==0){
signal(Wmutex);
signal(Rmutex);
设计思路
利用事件对象实现P、V操作
主要数据结构intreadcount=0;
intwritecount=0;
structMySemaphore
{
HANDLEs1,s2;
intc;
};
MySemaphoreReaderS;
MySemaphoreWriterS;
structThreadInfo
int serial;
charentity;
double delay;
double persist;
主要代码结构及分析
///////////////////////////////////////////////////////////////
//ReaderPriorityfuction
//file:
filename
//////////////////////////////////////////////////////////////
voidReaderPriority(char*file)
DWORDn_thread=0;
DWORDthread_ID;
DWORDwait_for_all;
initMySemaphore(&
ReaderS,1);
initMySemaphore(&
WriterS,1);
readcount=0;
//initreadercount
//TreadObjectArray
HANDLEh_Thread[MAX_THREAD_NUM];
ThreadInfothread_info[MAX_THREAD_NUM];
ifstreaminFile;
inFile.open(file);
//openfileprintf("
ReaderPriority:
\n\n"
);
while(inFile)
//readeveryreader/writerinfoinFile>
>
thread_info[n_thread].serial;
inFile>
thread_info[n_thread].entity;
thread_info[n_thread].delay;
thread_info[n_thread++].persist;
inFile.get();
}//endwhileinFile.close();
for(inti=0;
i<
(int)(n_thread);
i++)
if(thread_info[i].entity=='
R'
||thread_info[1].entity=='
r'
)
//CreateReaderthread
h_Thread[i] = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)(RP_ReaderThread),
&
thread_ID);
thread_info[i],
//CreateWriterthread
(LPTHREAD_START_ROUTINE)(RP_WriterThread),&
}//endfor
//waitingallthreadwillbeenfinished
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
printf("
AllreaderandwriterthreadhavefinishedOperating.\n"
);
closeMySemaphore(&
WriterS);
closeMySemaphore(&
ReaderS);
}//endreaderPriority
voidwait(MySemaphore*myS)
WaitForSingleObject(myS->
s1,INFINITE);
myS->
c--;
if(myS->
c<
0)
SetEvent(myS->
s1);
WaitForSingleObject(myS->
s2,INFINITE);
voidsignal(MySemaphore*myS)
c++;
=0)
else
SetEvent(myS->
s2);
////////////////////////////////////
//readerpriority--readerthread
//p:
readerthreadinfo
///////////////////////////////////
DWORDWINAPIRP_ReaderThread(void*p)
DWORDm_delay;
DWORDm_persist;
intm_serial;
//getinfofroampara
m_serial=((ThreadInfo*)(p))->
serial;
m_delay=(DWORD)(((ThreadInfo*)(p))->
delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo*)(p))->
persist*INTE_PER_SEC);
Sleep(m_delay);
printf("
Readerthread%dsentsthereadingrequire.\n"
m_serial);
wait(&
if(readcount==0)
wait(&
readcount++;
signal(&
//readfile
Readerthread%dbeginstoreadfile.\n"
Sleep(m_persist);
//exitthread
Readerthread%dfinishedreadingfile.\n"
readcount--;
if(readcount==0)
signal(&
return0;
//Readerpriority--writerthread
writerthreadinfo
DWORDWINAPIRP_WriterThread(void*p)
DWORDm_persist;
Writerthread%dsentsthewritingrequire.\n"
//waitresourcewait(&
//writetothefile
Writerthread%dbeginstowritetothefile.\n"
Writerthread%dfinishedWritingtothefile.\n"
//releaseresourcesignal(&
return0;
3.实践结果
基本数据:
²
源程序代码行数:
256
完成实践投入的时间(小时数):
5
ü
资料查阅时间:
1.5
编程调试时间:
3.5
测试数据设计
“ex5.dat”中测试数据为:
1R35
2W45
3R52
4R65
5W53
测试结果分析
待所有读进程执行完毕后写进程才开始一一执行,结果正确。
4.实践体会
实践过程中遇到的问题及解决过程
在调试时,一开始总会出现某个进程sentsrequire的信息重复出现两次,但该线程只执行过一次的现象,调整显示代码的位置得不到正确的结果。
后将读写进程函数由voidRP_ReaderThread(void*p);
voidRP_WriterThrea