Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab9

.cpp
Скачиваний:
37
Добавлен:
15.06.2014
Размер:
3.14 Кб
Скачать
#include <windows.h>
#include <process.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))

CRITICAL_SECTION csec;
char buffer[10];
HANDLE hSemaphore, hstdout;
DWORD actlen;

unsigned __stdcall thread1(void *arg)
{
  for (int i = 0; i < 7;)	
  {
	WaitForSingleObject(hSemaphore, INFINITE);
	buffer[0] = 'q'; buffer[1] = 'w'; buffer[2] = 'e'; buffer[3] = 'r'; buffer[4] = 't';
	ReleaseSemaphore(hSemaphore, 1, 0);
	//printf("writer 1, wrote 1st part\n");
	Sleep(GetRandom(200, 1500));
	WaitForSingleObject(hSemaphore, INFINITE);
	buffer[5] = 'q'; buffer[6] = 'w'; buffer[7] = 'e'; buffer[8] = 'r'; buffer[9] = 0;
	ReleaseSemaphore(hSemaphore, 1, 0);
	//printf("writer 1, wrote 2nd part\n");
	Sleep(2000);
  }
_endthreadex(0);
return 0;
}

unsigned __stdcall thread2(void *arg)
{
for (int i = 0; i < 7;)	
{
	WaitForSingleObject(hSemaphore, INFINITE);
	buffer[0] = 'd'; buffer[1] = 'd'; buffer[2] = 'd'; buffer[3] = 'd'; buffer[4] = 'd';
	ReleaseSemaphore(hSemaphore, 1, 0);
	//printf("writer 2, wrote 1st part\n");
	Sleep(GetRandom(500, 2000));
	WaitForSingleObject(hSemaphore, INFINITE);
	buffer[5] = 'd'; buffer[6] = 'd'; buffer[7] = 'd'; buffer[8] = 'd'; buffer[9] = 0;
	ReleaseSemaphore(hSemaphore, 1, 0);
	//printf("writer 2, wrote 2nd part\n");
	Sleep(2500);
}	
_endthreadex(0);
return 0;
}

unsigned __stdcall thread3(void *arg)
{
EnterCriticalSection(&csec);
for (int i = 0; i < 7; i++)
{
	WaitForSingleObject(hSemaphore, INFINITE);
	printf("%s\n", buffer);
	ReleaseSemaphore(hSemaphore, 1, 0);
	Sleep(GetRandom(200, 300));
}
LeaveCriticalSection(&csec);
_endthreadex(0);
return 0;
}

unsigned __stdcall thread4(void *arg)
{
EnterCriticalSection(&csec);
for (int i = 0; i < 7; i++)
{
	WaitForSingleObject(hSemaphore, INFINITE);
	printf("                %s\n", buffer);
	ReleaseSemaphore(hSemaphore, 1, 0);
	Sleep(GetRandom(200, 350));
}
LeaveCriticalSection(&csec);
_endthreadex(0);
return 0;
}

unsigned __stdcall thread5(void *arg)
{
EnterCriticalSection(&csec);
for (int i = 0; i < 7; i++)
{
	WaitForSingleObject(hSemaphore, INFINITE);
	printf("                                   %s\n", buffer);
	ReleaseSemaphore(hSemaphore, 1, 0);
	Sleep(GetRandom(100, 200));
}
LeaveCriticalSection(&csec);
_endthreadex(0);
return 0;
}

int main()
{
	HANDLE hthread1, hthread2, hthread3, hthread4, hthread5;
	unsigned int threadid1, threadid2, threadid3, threadid4, threadid5;
	hstdout=GetStdHandle(STD_OUTPUT_HANDLE);
	InitializeCriticalSection(&csec);
	hSemaphore = CreateSemaphore(NULL, 1, 0, NULL);
	hthread1=(HANDLE)_beginthreadex(NULL, 4096, &thread1, (void *)1,  0, &threadid1);
	hthread2=(HANDLE)_beginthreadex(NULL, 4096, &thread2, (void *)1,  0, &threadid2);
	hthread3=(HANDLE)_beginthreadex(NULL, 4096, &thread3, (void *)1,  0, &threadid3);
	hthread4=(HANDLE)_beginthreadex(NULL, 4096, &thread4, (void *)1,  0, &threadid4);
	hthread5=(HANDLE)_beginthreadex(NULL, 4096, &thread5, (void *)1,  0, &threadid5);
	getchar();
	return 0;
}
Соседние файлы в предмете Операционные системы