資源簡介
1 實驗目標
能夠編寫程序模擬讀者 寫者問題
2 實驗要求
在Windows2000環境下 創建一個控制臺進程 此進程包含n個線程 用這n個線程來表示n個讀者或寫者 每個線程按相應測試數據文件 后面有介紹 的要求進行讀寫操作 用信號量機制分別實現讀者優先和寫者優先的讀者 寫者問題
讀者 寫者問題的讀寫操作限制 包括讀者優先和寫者優先 :
1 寫 寫互斥 即不能有兩個寫者同時進行寫操作
2 讀 寫互斥 即不能同時有一個線程在讀 而另一個線程在寫
3 讀 讀允許 即可以有一個或多個讀者在讀
讀者優先的附加限制:如果一個讀者申請進行讀操作時已有另一個讀者正在進行讀操作 則該讀者可直接開始讀操作
寫者優先的附加限制:如果一個讀者申請進行讀操作時已有另一寫者在等待訪問共享資源 則該讀者必須等到沒有寫者處于等待狀態后才能開始讀操作
運行結果顯示要求:要求在每個線程創建 發出讀寫操作申請 開始讀寫操作和結束讀寫操作時分別顯示一行提示信息 以確定所有處理都遵守相應的讀寫操作限制 ">1 實驗目標
能夠編寫程序模擬讀者 寫者問題
2 實驗要求
在Windows2000環境下 創建一個控制臺進程 此進程包含n個線程 用這n個線程來表示n個讀者或寫者 每個線程按相應測試數據文件 后面有介紹 的要求進行讀寫操 [更多]

代碼片段和文件信息
#include??“windows.h“
#include??
#include??
#include??
#include??
#include??
#include??
#define??READER?‘R‘
#define??WRITER?‘W‘
#define??INTE_PER_SEC?1000
#define??MAX_THREAD_NUM?64
#define??MAX_FILE_NUM?32
#define??MAX_STR_LEN?32
int??readcount=0;
int??writecount=0;
CRITICAL_SECTION?RP_Write;
CRITICAL_SECTION?cs_Write;
CRITICAL_SECTION?cs_Read;
struct?ThreadInfo//?定義線程數據結構
{
int?serial;//?線程序號
char?entity;//?線程類別(判斷是讀者線程還是寫者線程)
double?delay;//?線程延遲
double?persist;//?線程讀寫操作持續時間
};
///////////////////////////////////////////////////////////////////////
//讀者優先--讀者線程
//p:讀者線程信息
void?RP_ReaderThread(void?*p)
{
??HANDLE?h_Mutex;
??h_Mutex=OpenMutex(MUTEX_ALL_ACCESSFALSE“mutex_for_readcount“);
??DWORD?wait_for_mutex;//等待互斥變量所有權
??DWORD?m_delay;??//延遲時間
??DWORD?m_persist;//讀文件持續時間
??int?m_serial;//線程序號
??
??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?(“Reader?thread?%d?sents?the?reading?require.\n“m_serial);
??wait_for_mutex=WaitForSingleobject(h_Mutex-1);
??readcount++;
??if(readcount==1)
??{
??EnterCriticalSection(&RP_Write);
??}
??ReleaseMutex(h_Mutex);
??printf(“Reader?thread?%d?begins?to?read?file.\n“m_serial);
??Sleep(m_persist);
??printf(“Reader?thread?%d?finished?reading?file.\n“m_serial);
??wait_for_mutex=WaitForSingleobject(h_Mutex-1);
??readcount--;
??if(readcount==0)
??{
??LeaveCriticalSection(&RP_Write);
??}
??ReleaseMutex(h_Mutex);
}
//////////////////////////////////////////////////////////////////////////
//讀者優先--寫者線程
//p:寫者線程信息
void?RP_WriterThread(void?*p)
{
??DWORD?m_delay;
??DWORD?m_persist;
??int?m_serial;
??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(“Writer?thread?%d?sents?the?writing?require.\n“m_serial);
???EnterCriticalSection(&RP_Write);
???printf(“Writer?thread?%d?begins?to?write?the??file.\n“m_serial);
???Sleep(m_persist);
???printf(“Writer?thread?%d?finishing?writing?to?the?file.\n“m_serial);
???LeaveCriticalSection(&RP_Write);
}
/////////////////////////////////////////////////////////////////
//讀者優先處理函數
//file:文件名
void?ReaderPriority(char?*file)
{
DWORD?n_thread=0;?//?線程數目
DWORD?thread_ID;//?線程ID
DWORD?wait_for_all;//?等待所有線程結束
HANDLE?h_Mutex;//?互斥對象
h_Mutex=CreateMutex(NULLFALSE“mutex_for_readcount“);
HANDLE?h_Thread[MAX_THREAD_NUM];//?線程對象的數組
ThreadInfo?thread_info[MAX_THREAD_NUM];
readcount=0;
InitializeCriticalSection(&RP_Write);
ifstream?inFile;
inFile.open(file);
printf(“Reader?Priority:\n\n“);
while(inFile)//讀人每一個讀者、寫者的信息
{
inFile>>thread_info[n_thread].serial;
????????inFile>>thread_info[n_thread].entity;
????????inFile>>t
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????????43??2013-10-16?17:05??thread.dat
?????文件????????8394??2013-10-16?17:20??讀者寫者問題.cpp
?????文件??????137728??2014-02-12?00:23??實驗報告.doc
- 上一篇:大學數據結構期末考試試題(有答案)
- 下一篇:ios上傳照片、拍照上傳demo
評論
共有 條評論