?? 源代碼.txt
字號:
#include <windows.h>
#include <conio.h>
#include "fstream.h"
#include <stdio.h>
int read_count=0; //記錄讀者數目,開始為0
int write_count=0; //記錄寫者數目,開始為0
CRITICAL_SECTION RP_Write; //臨界資源區
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
struct ProcessInfo //線程信息
{ int Process_serial_number; //線程序號
double Process_Delay; //線程讀/寫持續時間
double Process_Start; //線程開始時間
char ProcessClass; //判斷線程是讀者還是寫者(即線程類別)
};
void R_Fun(char* file);//讀者優先函數
void R_ReaderProcess(void *p);//處理讀者優先讀者線程
void R_WriterProcess(void *p);//處理讀者優先寫者線程
void W_Fun(char* file); //寫者優先函數
void W_ReaderProcess(void *p);//處理寫者優先讀者線程
void W_WriterProcess(void *p);//處理寫者優先寫者線程
int main() //進程主函數
{
char select;
while (true)
{
printf("★★★★★★★★★★★★驗證實現讀者-寫者問題★★★★★★★★★★★★\n");
printf("\n");
printf(" a:執行讀者優先\n");
printf("\n");
printf(" b:執行寫者優先\n");
printf("\n");
printf(" c:關閉本窗口\n");
printf("\n");
printf(" 根據提示選擇要進行的操作:");
do
{
cin>>select;
if(select!='a' && select!='b' && select!='c')
printf("\n 輸入錯誤,務必選擇a/b/c中的一個字母!");
}while (select!='a' && select!='b' && select!='c');
system("cls");
if (select=='c')
return 0;//關閉本窗口
else if (select=='a') //運行讀者優先函數
R_Fun("yanzheng.txt");
else if(select=='b') //運行寫者優先函數
W_Fun("yanzheng.txt");
printf("\n 是否還要繼續? 1. 繼續(返回主窗口) 2.退出(關閉該程序)");
do
{
cin>>select;
if(select!='1' && select!='2' )
printf("\n 輸入錯誤,務必輸入1/2中的一項!");
}while (select!='1' && select!='2');
if(select=='2')
return 0;// 退出(關閉程序)
system("cls");
}
return 0;
}
//以下為讀者優先函數
void R_Fun(char* file)
{
DWORD Process_ID; //線程ID
DWORD waiting_for_all_process; //等待所有線程結束
DWORD Processnumber=0; //定義線程數初值為0
//臨界資源
HANDLE h_Mutex;
//互斥對象(h_Mutex)確保線程擁有對單個資源的互斥訪問權
h_Mutex=CreateMutex(NULL,FALSE,"mutex_for_read_count");
HANDLE h_process[64]; //線程對象數組,最大64
ProcessInfo process_info[64];
read_count=0;
InitializeCriticalSection(&RP_Write); //初始化臨界區
ifstream inFile;
inFile.open(file);
printf(" 讀者優先 運行過程:\n");
printf("\n");
while (inFile)
{//讀入每一個讀者/寫者的信息
inFile>>process_info[Processnumber].Process_serial_number
>>process_info[Processnumber].ProcessClass
>>process_info[Processnumber].Process_Start
>>process_info[Processnumber].Process_Delay;
if (-1 == inFile.get())
break;
Processnumber++;//線程數自加
}
for (int i=0;i<(int)(Processnumber);i++)
{
if (process_info[i].ProcessClass=='r') //創建讀者線程
h_process[i]=CreateThread(NULL,0,\
(LPTHREAD_START_ROUTINE)(R_ReaderProcess),\
&process_info[i],0,&Process_ID);
else //創建寫者線程
h_process[i]=CreateThread(NULL,0,\
(LPTHREAD_START_ROUTINE)(R_WriterProcess),\
&process_info[i],0,&Process_ID);
}
waiting_for_all_process=WaitForMultipleObjects(Processnumber,h_process,TRUE,-1);
printf("\n");
printf(" 已完成所有讀者和寫者線程操作,請根據提示繼續操作 \n");
}
//以下為讀者優先--讀者線程
void R_ReaderProcess(void *p)
{
//互斥變量
HANDLE h_Mutex;
h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read_count");
DWORD m_delay_time; //延遲時間
DWORD m_Process__Delay; //讀操作持續時間
DWORD waiting_for_mutex; //等待互斥變量所有權
int m_Process_serial_number; //線程序號
m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
Sleep(m_delay_time); //延遲等待
printf("讀者 %d 發出讀請求.\n",m_Process_serial_number);
//等待互斥對象通知
waiting_for_mutex=WaitForSingleObject(h_Mutex,-1); //等待互斥信號,保證對read_count的訪問、
//修改互斥
read_count++; //讀者數目加一
if (read_count==1)
EnterCriticalSection(&RP_Write);//禁止寫者進入
ReleaseMutex(h_Mutex);//釋放互斥對象,允許下個讀者繼續讀:
//讀操作
printf("讀者 %d 開始讀操作.\n",m_Process_serial_number);
Sleep(m_Process__Delay);
//退出線程
printf("讀者 %d 完成讀操作.\n",m_Process_serial_number);
waiting_for_mutex=WaitForSingleObject(h_Mutex,-1); //等待互斥信號,保證對read_count的訪問、修改互斥
read_count--; //讀者數目減少
if (read_count==0)
LeaveCriticalSection(&RP_Write); //如果所有讀者讀完,喚醒寫者
ReleaseMutex(h_Mutex);//釋放互斥信號
}
//以下為讀者優先--寫者線程
void R_WriterProcess(void *p)
{
int m_Process_serial_number; //線程序號
DWORD m_delay_time; //延遲時間
DWORD m_Process__Delay; //讀操作持續時間
//從參數中獲得信息
m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
Sleep(m_delay_time); //延遲等待
printf("寫者 %d 發出寫請求.\n",m_Process_serial_number);
EnterCriticalSection(&RP_Write);//禁止下一位寫者進入
//寫操作
printf("寫者 %d 開始寫操作.\n",m_Process_serial_number);
Sleep(m_Process__Delay);
//退出線程
printf("寫者 %d 完成寫操作.\n",m_Process_serial_number);
LeaveCriticalSection(&RP_Write); //如果所有讀者讀完,喚醒寫者
}
//以下為寫者優先處理函數
void W_Fun(char* file)
{
DWORD Process_ID; //線程ID
DWORD Processnumber=0; //線程數目
DWORD waiting_for_all_process; //等待所有線程結束
//互斥對象
HANDLE h_Mutex1, h_Mutex2, h_Mutex3;
h_Mutex1 = CreateMutex(NULL, FALSE, "mutex_for_write_count");
h_Mutex2 = CreateMutex(NULL, FALSE, "mutex_for_read_count");
h_Mutex3 = CreateMutex(NULL, FALSE, "mutex_for_read");
//線程對象數組
HANDLE h_process[64];
ProcessInfo process_info[64];
read_count=0; //初始化read_count
InitializeCriticalSection(&cs_Write); //初始化臨界區
InitializeCriticalSection(&cs_Read);
ifstream inFile;
inFile.open(file); //打開操作
printf(" 寫者優先 運行過程:\n");
printf("\n");
while (inFile)
{//讀入每一個讀者、寫者的信息
inFile>>process_info[Processnumber].Process_serial_number
>>process_info[Processnumber].ProcessClass
>>process_info[Processnumber].Process_Start
>>process_info[Processnumber].Process_Delay;
if(-1 == inFile.get())
break;
Processnumber++;//線程數自加
}
for (int i=0;i<(int)(Processnumber);i++)
{
if (process_info[i].ProcessClass=='r')
//創建讀者線程
h_process[i]=CreateThread(NULL,0,\
(LPTHREAD_START_ROUTINE)(W_ReaderProcess),\
&process_info[i],0,&Process_ID);
else
//創建寫者線程
h_process[i]=CreateThread(NULL,0,\
(LPTHREAD_START_ROUTINE)(W_WriterProcess),\
&process_info[i],0,&Process_ID);
}
//等待所有線程結束
waiting_for_all_process=WaitForMultipleObjects(Processnumber,h_process,TRUE,-1);
printf("\n");
printf(" 已完成所有讀者和寫者線程操作,根據提示繼續操作!");
}
//以下為寫者優先--寫者線程
void W_WriterProcess(void *p)
{
//互斥變量
HANDLE h_Mutex1;
h_Mutex1 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_write_count");
int m_Process_serial_number; //線程序號
DWORD m_delay_time; //延遲時間
DWORD m_Process__Delay; //讀操作持時續間
DWORD waiting_for_mutex; //等待互斥變量所有權
m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);//每秒時鐘中斷100次
m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100); Sleep(m_delay_time);
printf("寫者 %d 發出寫請求.\n",m_Process_serial_number);
waiting_for_mutex=WaitForSingleObject(h_Mutex1,-1);
write_count++;
if (write_count==1)
EnterCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex1);
EnterCriticalSection(&cs_Write);
printf("寫者 %d 開始寫操作.\n",m_Process_serial_number);
Sleep(m_Process__Delay);
printf("寫者 %d 完成寫操作.\n",m_Process_serial_number);
LeaveCriticalSection(&cs_Write);
waiting_for_mutex=WaitForSingleObject(h_Mutex1,-1);
write_count--;
if(write_count == 0)
LeaveCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex1);
}
//以下為寫者優先--讀者線程
void W_ReaderProcess(void *p)
{
HANDLE h_Mutex2, h_Mutex3;
h_Mutex2 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read_count");
h_Mutex3 = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex_for_read");
DWORD waiting_for_mutex, waiting_for_mutex1;
//等待互斥變量所有權
DWORD m_delay_time; //延遲時間
DWORD m_Process__Delay; //讀操作持續時間
int m_Process_serial_number; //線程序號
m_Process_serial_number=((ProcessInfo *)(p))->Process_serial_number;
m_delay_time=(DWORD)(((ProcessInfo *)(p))->Process_Start*100);
m_Process__Delay=(DWORD)(((ProcessInfo *)(p))->Process_Delay*100);
Sleep(m_delay_time);
printf("讀者 %d 發出讀請求.\n",m_Process_serial_number);
waiting_for_mutex1=WaitForSingleObject(h_Mutex3,-1);
EnterCriticalSection(&cs_Read);
LeaveCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex3);
waiting_for_mutex=WaitForSingleObject(h_Mutex2,-1);
read_count++;
if (read_count == 1)
EnterCriticalSection(&cs_Write);
ReleaseMutex(h_Mutex2);
printf("讀者 %d 開始讀操作.\n",m_Process_serial_number);
Sleep(m_Process__Delay);
printf("讀者 %d 完成讀操作.\n",m_Process_serial_number);
waiting_for_mutex=WaitForSingleObject(h_Mutex2,-1);
read_count--;
if (read_count == 0)
LeaveCriticalSection(&cs_Write);
ReleaseMutex(h_Mutex2);
} //結束
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -