⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ex5.cpp

📁 软件课程设计代码
💻 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 + -