📄 ex5.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 + -