任务5- 事件对象解决读写者问题.docx
- 文档编号:748761
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:7
- 大小:21.30KB
任务5- 事件对象解决读写者问题.docx
《任务5- 事件对象解决读写者问题.docx》由会员分享,可在线阅读,更多相关《任务5- 事件对象解决读写者问题.docx(7页珍藏版)》请在冰点文库上搜索。
1.基本信息
Ø实践题目:
事件对象实现P、V操作并解决读写者问题
Ø完成人:
班级:
07062301
姓名:
陈杨
学号:
0706230101
Ø报告日期:
2011年1月5日
2.实践内容简要描述
Ø实践目标
1.掌握事件对象的使用方法
2.理解P、V操作的内部机制及读者-写者问题的实现方法。
Ø实践内容
用Win32提供的同步对象实现P、V操作,并使用它们解决读者-写者问题利用事件机制模拟多值信号量。
算法如下:
binary-semaphoreS1,S2; //initializtion:
S1=1,S2=0intC; //initializtion:
thecountofrecource
wait():
Wait(S1);
C--;
if(C<0){
signal(S1);wait(S2);
}
signal(S2);
signal():
wait(S1);
C++;
if(C<=0) {
signal(S2);
}
else{
signal(S1);
}
读者-写者问题算法如下:
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;inFile>>thread_info[n_thread].delay;inFile>>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],
0,
}
else{
//CreateWriterthread
h_Thread[i] = CreateThread(
NULL,
0,
(LPTHREAD_START_ROUTINE)(RP_WriterThread),&thread_ID);
}
&thread_info[i],
0,
}//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);
}
SetEvent(myS->s1);
}
voidsignal(MySemaphore*myS)
{
WaitForSingleObject(myS->s1,INFINITE);myS->c++;
if(myS->c<=0)
{
}
else
{
}
}
SetEvent(myS->s2);
SetEvent(myS->s1);
////////////////////////////////////
//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(&ReaderS);
if(readcount==0)
{
wait(&WriterS);
}
readcount++;signal(&ReaderS);
//readfile
printf("Readerthread%dbeginstoreadfile.\n",m_serial);Sleep(m_persist);
//exitthread
printf("Readerthread%dfinishedreadingfile.\n",m_serial);wait(&ReaderS);
readcount--;if(readcount==0)
{
signal(&WriterS);
}
signal(&ReaderS);return0;
}
////////////////////////////////////
//Readerpriority--writerthread
//p:
writerthreadinfo
///////////////////////////////////
DWORDWINAPIRP_WriterThread(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("Writerthread%dsentsthewritingrequire.\n",m_serial);
//waitresourcewait(&WriterS);
//writetothefile
printf("Writerthread%dbeginstowritetothefile.\n",m_serial);Sleep(m_persist);
//exitthread
printf("Writerthread%dfinishedWritingtothefile.\n",m_serial);
//releaseresourcesignal(&WriterS);
return0;
}
3.实践结果
Ø基本数据:
²源程序代码行数:
256
²完成实践投入的时间(小时数):
5
ü资料查阅时间:
1.5
ü编程调试时间:
3.5
Ø测试数据设计
“ex5.dat”中测试数据为:
1R35
2W45
3R52
4R65
5W53
Ø测试结果分析
待所有读进程执行完毕后写进程才开始一一执行,结果正确。
4.实践体会
Ø实践过程中遇到的问题及解决过程
在调试时,一开始总会出现某个进程sentsrequire的信息重复出现两次,但该线程只执行过一次的现象,调整显示代码的位置得不到正确的结果。
后将读写进程函数由voidRP_ReaderThread(void*p);voidRP_WriterThread(void*p);改为DWORDWINAPIRP_ReaderThread(void*p);DWORDWINAPIRP_WriterThread(void*p);并在函数体最后加上return0语句。
该问题顺利解决。
Ø实践体会和收获
通过此次实验,我学会了事件对象的使用方法,并深入了解了P、V算法的机制及用其解决读着-写者问题的实现方法。
同时我也锻炼了自己的编程能力。
5.参考文献
²[1]汤子灜著.《计算机操作系统》(修订版)[M].西安:
西安电子科技大学出版社.2000
²[2]AbrahamSilberschatz,PeterBaerGalvinandGregGagne.郑扣根等译.操作
系统概念第六版,翻译版.[M].北京:
高等教育出版社.2004
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 任务5- 事件对象解决读写者问题 任务 事件 对象 解决 读写 问题