91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

  • 大小: 8KB
    文件類型: .cpp
    金幣: 1
    下載: 0 次
    發布日期: 2021-05-25
  • 語言: C/C++
  • 標簽:

資源簡介

讀者-寫者問題的讀寫操作要求: 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

評論

共有 條評論

相關資源