/*控制进程并发,实现高效正确的并发誊抄过程*/
#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
今日推荐
周排行