Добавил:
Yanus
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:lab9
.cpp#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;
}
Соседние файлы в предмете Операционные системы