資源簡介
windows操作系統內核實驗。讀者寫者問題。創建一個控制臺進程。此進程包含n個線程。用這n個線程來表示n個讀者或寫者。每個線程按相應測試數據文件要求進行讀寫操作。用信號量機制分別實現讀者優先和寫者優先的讀者-寫者問題。

代碼片段和文件信息
//OS_EXP1_ReadAndWrite
//操作系統實驗一:讀者寫者問題
//ReadAndWrite.cpp
#include
#include
#include
#include
#include
#include
#include
using?namespace?std;
#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;???//互斥變量
//OpenMutex函數功能:為現有的一個已命名互斥體對象創建一個新句柄
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(“讀者線程?%d?申請讀文件操作.\n“m_serial);
??? wait_for_mutex?=?WaitForSingleobject(h_Mutex-1);
??? readcount++; //讀者數目增加
??? if(readcount?==?1){
EnterCriticalSection(&?RP_Write); //第一個讀者等待資源
}
????ReleaseMutex(h_Mutex); //釋放互斥信號
printf(“讀者線程?%d?開始讀文件.\n“m_serial);?//讀文件
??? Sleep(m_persist);
??? printf(“讀者線程?%d?讀文件完畢.\n“m_serial);? //退出線程
??? wait_for_mutex?=?WaitForSingleobject(h_Mutex-1);
??? readcount--;//讀者數目減少
??? if(readcount?==?0){
??? ????LeaveCriticalSection(&?RP_Write);
??? }
??? ReleaseMutex(h_Mutex); //釋放互斥信號
}
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(“寫者線程?%d?申請寫文件操作.\n“m_serial);???
??? EnterCriticalSection(&?RP_Write);? //等待資源
??? printf(“寫者線程?%d?開始寫文件.\n“m_serial);? //寫文件
??? Sleep(m_persist);
??? printf(“寫者線程?%d?寫文件完畢.\n“m_serial);?? //退出線程
LeaveCriticalSection(&?RP_Write);? //釋放資源
}
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_THR
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????????45??2012-10-07?21:31??thread.dat
?????文件????????9674??2012-10-28?23:51??ReadAndWrite.cpp
- 上一篇:操作系統實驗報告_讀者寫者問題.doc
- 下一篇:截圖并讓圖片顯示最前面
評論
共有 條評論