資源簡介
讀者-寫者問題的讀寫操作要求:
1.寫-寫互斥:不能有兩個寫者同時進行寫操作
2.讀-寫互斥:不能同時有一個線程在讀,而另一個線程在寫。
3.讀-讀允許:可以同時有多個讀者在讀。
讀者優先時,讀者的優先權比寫者高, 如果讀者申請進行讀操作時已有另一個讀者正在進行讀操作,則該讀者可直接開始讀操作。如果當前是寫者已經占有了文件的時候,則別的讀者必需等待該操作完成后,才能開始讀操作。
寫者優先時,寫者的優先權比讀者高, 在一個寫者提出要訪問文件時,就必須使其盡可能的得到文件,而且不用調配,而且寫者在運行時不允許讀者進入。
代碼片段和文件信息
#include?
#include??
#include?
////使用文件
struct?ThreadInfo???//線程信息
{ int?Threadid;???//編號
char?ThreadClass;//類別
double?ThreadBeginTime;?//開始時間
double?ThreadStayTime;//讀寫持續時間
};
struct?Monitor{//管程包括互斥變量和多個線程
???struct??ThreadInfo?thread_info[100];
???HANDLE?h_Mutex;//互斥變量
???CRITICAL_SECTION?RP_Write;//設置臨界區
???CRITICAL_SECTION?cs_Write;
???CRITICAL_SECTION?cs_Read;
}monitor;//定義一個名為monitor的管程
/////////////函數聲明?
void?Reader_first();//讀者優先函數
void?R_ReaderThread(void?*p);//處理讀者優先時的讀者
void?R_WriterThread(void?*p);//處理讀者優先時的寫者
void?Writer_first();//寫者優先函數 ??
void?W_ReaderThread(void?*p);?//處理寫者優先時的讀者
void?W_WriterThread(void?*p);?//處理寫者優先時的寫者
void?readfile(char*?file);//讀取文件內容,并創建相應讀者和寫者
void?quit();//退出程序
/*CRITICAL_SECTION?RP_Write;//設置臨界區
CRITICAL_SECTION?cs_Write;
CRITICAL_SECTION?cs_Read;*/
int?ReaderNum=0;?//讀者數目
int?WriterNum=0;?//寫者數目
void?readfile(char*?file)
{???
DWORD?wait_for_all;//等待所有線程結束
DWORD?thread_no=0;//讀者寫者總數初值為0
DWORD?thread_ID;?//ID
HANDLE?h_Thread[100];//線程對象數組,最大100
????ifstream?inFile;
inFile.open(file);??
while?(inFile)
{//讀入每一個讀者、寫者的信息
inFile>>monitor.thread_info[thread_no].Threadid
??????????>>monitor.thread_info[thread_no].ThreadClass
??????>>monitor.thread_info[thread_no].ThreadBeginTime
??????????>>monitor.thread_info[thread_no].ThreadStayTime;
if?(inFile.get()==‘#‘)
??break;//文件結束
thread_no++;//線程數加一
}
for?(int?i=0;i<(int)(thread_no);i++)
{
if?(monitor.thread_info[i].ThreadClass==‘r‘||monitor.thread_info[i].ThreadClass==‘R‘)
//創建讀者
h_Thread[i]=CreateThread(NULL0(LPTHREAD_START_ROUTINE)(R_ReaderThread)&monitor.thread_info[i]0&thread_ID);
else?
//創建寫者
h_Thread[i]=CreateThread(NULL0(LPTHREAD_START_ROUTINE)(R_WriterThread)&monitor.thread_info[i]0&thread_ID);
}
inFile.close();
wait_for_all=WaitForMultipleobjects(thread_noh_ThreadTRUE-1);
cout< //讀者優先函數
void?Reader_first()
{
//臨界資源
HANDLE?h_Mutex;
//互斥對象(h_Mutex)確保線程擁有對單個資源的互斥訪問權
h_Mutex=CreateMutex(NULLFALSE“mutex_for_ReaderNum“);
ReaderNum=0;?????
InitializeCriticalSection(&monitor.RP_Write);??//初始化臨界區
cout<<“The?reader?first:\n“< readfile(“RandW.txt“);
}
//讀者優先讀者
void?R_ReaderThread(void?*p)
{
monitor.h_Mutex=OpenMutex(MUTEX_ALL_ACCESSFALSE“mutex_for_ReaderNum“);
DWORD?wait_for_mutex;?//等待互斥變量所有權
DWORD?m_stay;?//延遲時間
DWORD?m_ThreadStayTime;//讀文件持續時間
int?m_Threadid;//線程序號
m_Threadid=((ThreadInfo?*)(p))->Threadid;
m_stay=(DWORD)(((ThreadInfo?*)(p))->ThreadBeginTime*100);
m_ThreadStayTime=(DWORD)(((ThreadInfo?*)(p))->ThreadStayTime*100);
Sleep(m_stay);???//延遲等待
cout<<“The?reader?“< wait_for_mutex=WaitForSingleobject(monitor.h_Mutex-1);//等待互斥信號,保證對ReaderNum的訪問
ReaderNum++;?//讀者數目加一
if?(ReaderNum==1)
EnterCriticalSection(&monitor.RP_Wr
- 上一篇:清華大學數據結構C語言版習題答案
- 下一篇:在固定分區管理方式下實現主存分配和回收
評論
共有 條評論