任务5- 事件对象解决读写者问题.docx

上传人:聆听****声音 文档编号:748761 上传时间:2023-04-30 格式:DOCX 页数:7 大小:21.30KB
下载 相关 举报
任务5- 事件对象解决读写者问题.docx_第1页
第1页 / 共7页
任务5- 事件对象解决读写者问题.docx_第2页
第2页 / 共7页
任务5- 事件对象解决读写者问题.docx_第3页
第3页 / 共7页
任务5- 事件对象解决读写者问题.docx_第4页
第4页 / 共7页
任务5- 事件对象解决读写者问题.docx_第5页
第5页 / 共7页
任务5- 事件对象解决读写者问题.docx_第6页
第6页 / 共7页
任务5- 事件对象解决读写者问题.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

任务5- 事件对象解决读写者问题.docx

《任务5- 事件对象解决读写者问题.docx》由会员分享,可在线阅读,更多相关《任务5- 事件对象解决读写者问题.docx(7页珍藏版)》请在冰点文库上搜索。

任务5- 事件对象解决读写者问题.docx

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

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

当前位置:首页 > 经管营销 > 财务管理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2