操作系统——控制进程并发,高效并发正确誊抄

/*控制进程并发,实现高效正确的并发誊抄过程*/

#include "stdio.h"
#include "conio.h"
#include "windows.h"
#include <iostream>
using namespace std;

HANDLE Mutex; 
HANDLE buf1_e;
HANDLE buf1_f;
HANDLE buf2_e;
HANDLE buf2_f;


typedef struct _THREADDATA
{
	FILE *infile;
	char *buf1;
	char *buf2;
}*LPTHREADDATA, THREADDATA;


DWORD WINAPI get(LPVOID lParam)
{
	LPTHREADDATA pData = (LPTHREADDATA)lParam;

	for (;*pData->buf1!=EOF;) 
	{
		WaitForSingleObject(buf1_e,INFINITE);//p
		*pData->buf1=fgetc(pData->infile);	
		ReleaseSemaphore(buf1_f,1,NULL);//v
	}

    return 0;
}

DWORD WINAPI copy(LPVOID lParam)
{
	LPTHREADDATA pData = (LPTHREADDATA)lParam;

	for (;*pData->buf1!=EOF;) 
	{
		WaitForSingleObject(buf1_f,INFINITE);//p(buf1_f)
		WaitForSingleObject(buf2_e,INFINITE);//p(buf2_e)
		*pData->buf2=*pData->buf1;
		ReleaseSemaphore(buf1_e,1,NULL);//v(buf1_e)
		ReleaseSemaphore(buf2_f,1,NULL);//v(buf2_f)
	}

	return 0;
}

DWORD WINAPI put(LPVOID lParam)
{
	LPTHREADDATA pData = (LPTHREADDATA)lParam;

	for (;*pData->buf1!=EOF;) 
	{
		WaitForSingleObject(buf2_f,INFINITE);//p
		cout<<*pData->buf2; 
		ReleaseSemaphore(buf2_e,1,NULL);//v
	}

	return 0;
}


int main()
{
 //   Mutex=CreateMutex(NULL,FALSE,NULL);   
	buf1_e=CreateSemaphore(NULL,1,1,NULL);
	buf1_f=CreateSemaphore(NULL,0,1,NULL);
	buf2_e=CreateSemaphore(NULL,1,1,NULL);
	buf2_f=CreateSemaphore(NULL,0,1,NULL);
	
	FILE *infile=fopen("in.txt","r");
	char buf1,buf2;
    LPTHREADDATA pData = new THREADDATA;
	pData->infile=infile;
	pData->buf1=&buf1;
	pData->buf2=&buf2;
   
	DWORD ThreadId1,ThreadId2,ThreadId3;
	::CreateThread(NULL, 0, copy, (LPVOID)pData, 0, &ThreadId2);	
	::CreateThread(NULL, 0, put, (LPVOID)pData, 0, &ThreadId3);	  
	::CreateThread(NULL, 0, get, (LPVOID)pData, 0, &ThreadId1);	

Sleep(20);
	//getch();
	fclose(infile);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/hfuturer/article/details/80219721