📄 ex5.cpp
字号:
#include <windows.h>
#include <conio.h>
#include <fstream.h>
#include <stdio.h>
#include "ex5.h"
#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;
struct ThreadInfo
{
int serial;
char entity;
double delay;
double persist;
};
PV RD_Mutex("MyRDEvent","MyRDEvent2");
PV WR_Mutex("MyWREvent","MyWREvent2");
void ReaderPriority( char* file );
void RP_ReaderThread(void* p);
void RP_WriterThread(void* p);
void P(int *x);
void V(int *y);
////////////////////////////////////////////////////////
// main fuction
////////////////////////////////////////////////////////
int main( int agrc, char* argv[] )
{
char ch;
while ( TRUE )
{
// Cleare screen
system( "cls" );
// display prompt info
printf("*********************************************\n");
printf(" 1.Start test\n");
printf(" 2.Exit to Windows\n");
printf("*********************************************\n");
printf("Input your choice(1or2): ");
// if the number inputed is error, retry!
do{
ch = (char)_getch();
}while( ch != '1' && ch != '2');
system ( "cls" );
if ( ch == '1')
ReaderPriority("sm5.dat");
else if ( ch == '2')
return 0;
printf("\nPress any key to finish this Program. \nThank you test this Proggram!\n");
_getch();
} //end while
} //end main
///////////////////////////////////////////////////////////////
// Reader Priority fuction
// file: filename
//////////////////////////////////////////////////////////////
void ReaderPriority( char* file )
{
DWORD n_thread = 0;
DWORD thread_ID;
DWORD wait_for_all;
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount = 0; //init readercount
ifstream inFile;
inFile.open(file); //open file
printf( "Reader Priority:\n\n" );
while ( inFile )
{
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>thread_info[n_thread].delay;
inFile>>thread_info[n_thread++].persist;
inFile.get();
}
for( int i = 0; i < (int)(n_thread); i++)
{
if(thread_info[i].entity == 'R' || thread_info[1].entity == 'r')
{
h_Thread[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(RP_ReaderThread), &thread_info[i], 0, &thread_ID);
}
else {
h_Thread[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(RP_WriterThread), &thread_info[i], 0, &thread_ID);
}
}
// waiting all thread will been finished
wait_for_all = WaitForMultipleObjects(n_thread,h_Thread,TRUE, -1);
RD_Mutex.~PV();
WR_Mutex.~PV();
printf("All reader and writer thread have finished Operating.\n");
}// end readerPriority
////////////////////////////////////
// reader priority -- reader thread
// p: reader thread info
///////////////////////////////////
void RP_ReaderThread(void* p)
{
DWORD m_delay;
DWORD m_persist;
int m_serial;
//get info froam para
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);
RD_Mutex.wait();
readcount++;
if (readcount == 1 )
{
// The frist reader
WR_Mutex.wait();
}
RD_Mutex.single();
// read file
printf("读者 %d 开始读文件.\n",m_serial);
Sleep(m_persist);
RD_Mutex.wait();
printf("读者 %d 完成读文件.\n",m_serial);
readcount--;
if ( readcount == 0 )
{
// singal Writer
WR_Mutex.single();
}
RD_Mutex.single();
}
////////////////////////////////////
// Reader priority -- writer thread
// p: writer thread info
///////////////////////////////////
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);
WR_Mutex.wait();
// write to the file
printf("写者 %d 开始写文件.\n",m_serial);
Sleep(m_persist);
printf("写者 %d 完成写文件.\n",m_serial);
WR_Mutex.single();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -