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

📄 process.cpp

📁 这个程序是我想了一个星期写出来 请大家帮忙看看呀
💻 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 + -