Событие – объекты синхронизации бывают двух типов: со сбросом в ручную , события с автосбросом. Для установки события в доступное состояние используется функция SetEvent. Для сброса в недоступное состояние — ResetEvent.
Для обеих функций единственным параметром служит Handle события.
События с автосбросом.
При освобождении события объект остается занятым пока он не потребуется другому потоку, тогда ОС автоматически сбросит для одного ей выбранного потока состояние объекта в доступное, разбудит поток и установит объект события в занятое состояние.
Существует функция PulseEvent — освободить событие, разрешить использование события ждущему его потоку и вновь занять событие.
Для создания события используется функция : HANDLE CREATEEVENT (lp Security_Attributes, bool Manual_Reset, bool InitionState, LPSTR Name)
2.если TRUE, то с автосбросом.
3.показывает занят или свободен объект события в момент создания.
4.аналог имени мьютекса.
Пример использования событий.
#define NUMTHREADS 4
HANDLE hGlobalWriteEvent;
Void CreateEventAndThreads();
{ HANDLE hReaEvents[NUMTHREADS], hThread;
DWORD i, IDThread;
HGlobalWriteEvent = CreateEvent (NULL,TRUE,FALSE,NULL);
// событие создается вручную с начальным состоянием занято
If (hGlobalWriteEvent = NULL)
Return;
For (i = 1; i<= NUMTHREADS;i++) //создается событие и поток, событие показывает, что поток занимается чтением
{hReadEvents[i-1] = CreateEvent(NULL,FALSE,TRUE,NULL);
hThread = CreateThread (NULL,0,THREADFUNCTION,&hReadEvents[i-1],0,&IDThread);
/* THREADFUNCTION – представляет собой функцию читатель из общего потока, hReadEvents-параметр этой функции представляет собой описатель события “i-1 потоку разрешается читать” */
}
} //создается глобальное событие, показывающее, что происходит запись
void WRITETOBUFFER( )
{
ResetEvent(hGlobalWriteEvent); // сигнализируется, что будет производиться запись.
DWORD WR = WaitForMultipleObjects(NUMTHREADS, hReadEvents, TRUE, INFINITY);
// ждать пока все читающие потоки не закончили свою работу
switch(WR)
{case Wait_Object_0; // производиться запись
break;
default // сообщение об ошибке
}
SetEvent(hGlobalWriteEvent); // указывает, что запись завершена.
for(i=0; i<= NUMTHREADS; i++ )
SetEvent ( hReadEvents[ i ] )
}
void THREADFUNCTION (LPVOID Param)
{
Haldle hE[2];
hE [0] = (Handle *)Param;
hE [1] = hGlobalWriteEvent;
pWaitForMultipleObjects(2,hE,TRUE,INFINITY);
// если рез-т этой ф-ии равняется Wait_Object_0,то произвести чтение из буфера
SetEvent(hE[0]);
}
после того как событие не нужно оно должно быть уничтожено вызовом CloseHandle.
Синхронизация при помощи событий.
05 Мар, 2009
