![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define THREADCOUNT 4
HANDLE ghWriteEvent;
HANDLE ghThreads[THREADCOUNT];
DWORD WINAPI ThreadProc(LPVOID);
void CreateEventsAndThreads(void)
{
int i;
DWORD dwThreadID;
ghWriteEvent = CreateEvent(
NULL,
TRUE,
FALSE,
TEXT("WriteEvent")
);
if (ghWriteEvent == NULL)
{
printf("CreateEvent failed (%d)\n", GetLastError());
return;
}
for(i = 0; i < THREADCOUNT; i++)
{
ghThreads[i] = CreateThread(
NULL, //Параметры безопасности
0, //Использовать размер стека по умолчанию
ThreadProc, //Функция потока
NULL, //Отсутствуют параметры для потока
0, //Флаги для старта потока по умолчанию
&dwThreadID);
if (ghThreads[i] == NULL)
{
printf("CreateThread failed (%d)\n", GetLastError());
return;
}
}
}
void WriteToBuffer(VOID)
{
printf("Main thread writing to the shared buffer...\n");
Sleep((int)(1000.0/(rand()%10)));
if (! SetEvent(ghWriteEvent))
{
printf("SetEvent failed (%d)\n", GetLastError());
return;
}
}
void CloseEvents()
{
CloseHandle(ghWriteEvent);
}
int main(void)
{
DWORD dwWaitResult;
CreateEventsAndThreads();
WriteToBuffer();
printf("Main thread waiting for threads to exit...\n");
dwWaitResult = WaitForMultipleObjects(
THREADCOUNT, // количество потоков в массиве
ghThreads, // массив дескрипторов потоков
TRUE, // ждать пока все потоки не завершатся
INFINITE);
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
printf("All threads ended, cleaning up for application exit...\n");
break;
default:
printf("WaitForMultipleObjects failed (%d)\n", GetLastError());
return 1;
}
CloseEvents();
_getch();
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
UNREFERENCED_PARAMETER(lpParam);
DWORD dwWaitResult;
printf("Thread %d waiting for write event...\n", GetCurrentThreadId());
dwWaitResult = WaitForSingleObject(
ghWriteEvent, // дескриптор потока
INFINITE); // ждать вечно
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
printf("Thread %d reading from buffer\n",
GetCurrentThreadId());
break;
default:
printf("Wait error (%d)\n", GetLastError());
return 0;
}
printf("Thread %d exiting\n", GetCurrentThreadId());
return 1;
}
Дата публикования: 2015-10-09; Прочитано: 163 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!