📄 process.cpp
字号:
#include "windows.h"
#include "stdlib.h"
#include "stdio.h"
#include "memory.h"
#include "Winbase.h"
#include <fstream.h>
#include <strstrea.h>
HANDLE Rmutex;
HANDLE Wmutex;
HANDLE workmutex;
long Rcount=0;
int k=0;
int count=0;
static long ThreadCompleted = 0;
HANDLE evtTerminate;
struct Data
{ long number;
char flag;
long apply;
unsigned long last;
unsigned long id;
};
struct Array
{ long number;
char flag;
char status;
};
Data data[50];
Array sequence[200];
unsigned long __stdcall write(void * data)
{
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='C'; // create
k++;
ReleaseMutex(workmutex);
Sleep(((Data*)data)->apply*1000);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='A'; // apply
k++;
ReleaseMutex(workmutex);
WaitForSingleObject(Wmutex, INFINITE);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='D'; // doing
k++;
for( unsigned long i=0; i<100000000*((Data*)data)->last; i++ );
ReleaseMutex(workmutex);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='E'; // end
k++;
ReleaseMutex(workmutex);
ReleaseMutex(Wmutex);
InterlockedIncrement(&ThreadCompleted);
if(ThreadCompleted >= count-1 ) SetEvent(evtTerminate);
return 2;
}
unsigned long __stdcall read( void *data)
{
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='C'; // create
k++;
ReleaseMutex(workmutex);
Sleep(((Data*)data)->apply*1000);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='A'; // apply
k++;
ReleaseMutex(workmutex);
WaitForSingleObject(Rmutex, INFINITE);
InterlockedIncrement(&Rcount);
if( Rcount==1 ) WaitForSingleObject(Wmutex, INFINITE);
ReleaseMutex(Rmutex);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='D'; // doing
k++;
for( unsigned long i=0; i<100000000*((Data*)data)->last; i++ );
ReleaseMutex(workmutex);
WaitForSingleObject(workmutex, INFINITE);
sequence[k].number=((Data*)data)->number;
sequence[k].flag=((Data*)data)->flag;
sequence[k].status='E'; // end
k++;
ReleaseMutex(workmutex);
WaitForSingleObject(Rmutex, INFINITE);
InterlockedDecrement(&Rcount);
if( Rcount==0 ) ReleaseMutex(Wmutex);
ReleaseMutex(Rmutex);
InterlockedIncrement(&ThreadCompleted);
if(ThreadCompleted >= count-1) SetEvent(evtTerminate);
return 1;
}
int main()
{
int i=0;
ofstream out;
ifstream in;
strstream str;
in.open("data.txt");
if(!in)
{ cout<<"\n Cann't Open file!"; return 1;}
out.open("result.txt");
char Buf[80];
for(i=0; ;i++)
{ in.getline(Buf,80);
if( strcmp(Buf,"")==0) break;
str<<Buf<<endl;
str>>data[i].number ;
str>>data[i].flag;
str>>data[i].apply;
str>>data[i].last;
count++;
}
in.close();
Rmutex = CreateMutex(NULL, FALSE, "Read");
Wmutex = CreateMutex(NULL, FALSE, "Write");
for( i=0; i<count; i++ )
{
if(data[i].flag=='R')
{ CreateThread(NULL,0,&read,&data[i], NULL, &data[i].id);
}
else
if( data[i].flag=='W')
{ CreateThread(NULL,0,&write,&data[i], NULL, &data[i].id);
}
Sleep(100);
}
Sleep(100000);
WaitForSingleObject(evtTerminate, INFINITE);
if(!out)
{ cout<<"\n Cann't Open file!"; return 0; }
for( i=0; i<k; i++ )
out<<sequence[i].number<<" "<<sequence[i].flag<<" "<<sequence[i].status<<endl;
out.close();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -