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

📄 ex5.cpp

📁 计算机操作系统的实验作业
💻 CPP
字号:
#include <windows.h>
#include <conio.h>
#include <fstream.h>
#include <stdio.h>

#define MAX_THREAD_NUM  64

int prime[9];

struct ThreadInfo {
	int	serial;
	char type;
	int	start;
	int end;
} ;
// Thread Object Array

HANDLE h_Thread[MAX_THREAD_NUM];
struct ThreadInfo  thread_info[MAX_THREAD_NUM];
HANDLE S_Empty[2];
HANDLE S_Full[2];
HANDLE h_Mutex;
int C_Full;
int C_Empty;
int to_write;
int to_read;
void control_thread ( char* file);
void code_of_thread (void* p);
void Wait(int &C,HANDLE S[2]);
void Signal(int &C,HANDLE S[2]);

////////////////////////////////////////////////////////
// main fuction
////////////////////////////////////////////////////////

int main( int agrc, char* argv[] )
{
	char ch;

	for(int i =0;i < 9;i ++)
		prime[i] = 0;
	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')
			control_thread("ex5.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

void control_thread( char* file)
{
	DWORD n_thread = 0;
	DWORD thread_ID;
	DWORD wait_for_all;
	int i;
	C_Full = 0;
	C_Empty = 9;
	to_write = 0;
	to_read = 0;
	S_Empty[0] = CreateSemaphore(NULL,1,1,NULL);
	S_Empty[1] = CreateSemaphore(NULL,0,1,NULL);
	S_Full[0] = CreateSemaphore(NULL,1,1,NULL);
	S_Full[1] = CreateSemaphore(NULL,0,1,NULL);
	h_Mutex = CreateMutex(NULL,FALSE,NULL);
	ifstream  inFile;
	inFile.open(file);		//open file
	printf( "Now, We begin to read thread information to thread_info array \n\n" );
	while ( inFile )
	{
		// read every thread info
		inFile>>thread_info[n_thread].serial;
		inFile>>thread_info[n_thread].type;
		inFile>>thread_info[n_thread].start;
		inFile>>thread_info[n_thread++].end;
		inFile.get();
	} //end while
	// Create all thread
	for(  i = 0; i < (int)(n_thread); i++)
	{
		// Create a thread
		h_Thread[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(code_of_thread), &thread_info[i], 0, &thread_ID);
	} //end for
	// Create thread
	// waiting all thread will been finished
	wait_for_all = WaitForMultipleObjects(n_thread,h_Thread,TRUE, -1);
	CloseHandle(S_Empty[0]);
	CloseHandle(S_Empty[1]);
	CloseHandle(S_Full[0]);
	CloseHandle(S_Full[1]);
	printf("All threads have finished Operating.\n");
}// end control_thread

void Wait(int &C,HANDLE S[2])
{
	WaitForSingleObject(S[0],-1);
	C--;
	if(C<0)
	{
		ReleaseSemaphore(S[0],1,NULL);
		WaitForSingleObject(S[1],-1);
	}
	ReleaseSemaphore(S[0],1,NULL);
}

void Signal(int &C,HANDLE S[2])
{
	WaitForSingleObject(S[0],-1);
	C++;
	if(C<=0)
		ReleaseSemaphore(S[1],1,NULL);
	else
		ReleaseSemaphore(S[0],1,NULL);
}
// thread

void code_of_thread (void* p)
{
	int m_serial;
	char m_type;
	int m_start;
	int m_end;

//get info froam para

	m_serial = ((ThreadInfo*) (p)) -> serial;
	m_type = char (((ThreadInfo*)(p))->type);
	m_start  = int (((ThreadInfo*)(p)) -> start);
	m_end  = int (((ThreadInfo*)(p)) -> end);
	
	int i = 0;
	int k = 0;
	if (m_type=='W'||m_type=='w') 
	{
		for( i=m_start; i <= m_end; i++)
		{
			if( i == 1)
				continue;
			for(int j = 2;j <= i/2;j ++)
			{
				if(i%j == 0)
					break;
			}
			if(j <= i/2)
				continue;
			Wait(C_Empty,S_Empty);
			WaitForSingleObject(h_Mutex,-1);
			prime[to_write] = i;
			printf("I am thread  %d , I am writing  %d to %d \n",m_serial,i,to_write);
			to_write = ++to_write%9;
			ReleaseMutex(h_Mutex);
			Signal(C_Full,S_Full);
			Sleep(10);
		}
	}
	else{
		int s = 0;
		do
		{
			Wait(C_Full,S_Empty);
			WaitForSingleObject(h_Mutex,-1);
			s ++;
			printf("I am thread  %d , I am earesing  %d from %d \n",m_serial,prime[to_read],to_read);
			prime[to_read] = 0;
			to_read = ++to_read%9;
			ReleaseMutex(h_Mutex);
			Signal(C_Empty,S_Empty);
			Sleep(20);
		}while(1&&s<12);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -