// Semaphores(lab10).cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<Windows.h>
#include<process.h>
#include<iostream>
#include<time.h>
HANDLE Read, Write,COut;
int count=0;
UINT WINAPI ThreadWrite1(LPVOID Param);
UINT WINAPI ThreadWrite2(LPVOID Param);
UINT WINAPI ThreadRead(LPVOID Param);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE Thread1,Thread2,Thread3;
HANDLE Semph=CreateSemaphore(NULL,TRUE,1,NULL);
CreatePipe(&Read,&Write,NULL,0);
COut=GetStdHandle(STD_OUTPUT_HANDLE);
Thread1=(HANDLE)_beginthreadex(0,0,ThreadWrite1,Semph,0,NULL);
Thread2=(HANDLE)_beginthreadex(0,0,ThreadWrite2,Semph,0,NULL);
Thread3=(HANDLE)_beginthreadex(0,0,ThreadRead,Semph,0,NULL);
HANDLE Threads[]={Thread1, Thread2, Thread3};
WaitForMultipleObjects(3,Threads,TRUE,INFINITE);
return 0;
}
UINT WINAPI ThreadWrite1(LPVOID Param)
{
srand(time(NULL));
HANDLE Semph=(HANDLE)Param,Fwr;
DWORD wait=1,num;
TCHAR digit[10]={0},Info[32]={0};
int x=0;
while (wait!=WAIT_OBJECT_0){
wait=WaitForSingleObject(Semph,INFINITE);
}
x=rand()%100+1;
WriteFile(Write,_itow(x,digit,10),sizeof(digit),&num,NULL);
_stprintf(Info,L"\nWriter1 writed: %d\n",x);
WriteConsole(COut,Info,_tcslen(Info),NULL,NULL);
count++;
ReleaseSemaphore(Semph,1,NULL);
return 0;
}
UINT WINAPI ThreadWrite2(LPVOID Param)
{
srand(time(NULL));
HANDLE Semph=(HANDLE)Param;
DWORD wait=1,num;
TCHAR digit[10]={0},Info[32]={0};
int x=0;
while (wait!=WAIT_OBJECT_0){
wait=WaitForSingleObject(Semph,INFINITE);
}
x=rand()%100-rand()%100;
WriteFile(Write,_itow(x,digit,10),sizeof(digit),&num,NULL);
_stprintf(Info,L"\nWriter2 writed: %d\n",x);
WriteConsole(COut,Info,_tcslen(Info),NULL,NULL);
count++;
ReleaseSemaphore(Semph,1,NULL);
return 0;
}
UINT WINAPI ThreadRead(LPVOID Param)
{
HANDLE Semph=(HANDLE)Param;
DWORD wait=1,num;
TCHAR digit[10]={0},Info[64]={0};
int i,x=0;
while (wait!=WAIT_OBJECT_0){
wait=WaitForSingleObject(Semph,INFINITE);
}
while(count){
ReadFile(Read,digit,sizeof(digit),&num,NULL);
x=_wtoi(digit);x*=10;
_stprintf(Info,L"\nRecieved digit was multiplied on 10: %d\n",x);
WriteConsole(COut,Info,_tcslen(Info),NULL,NULL);
count--;
}
ReleaseSemaphore(Semph,1,NULL);
return 0;
}