ПРИМЕР: Cинхронизация с помощью событий windows
Primary tabs
Forums:
События - объекты, оценивая состоянии которых , нити могут синхронизировать своё выполнение ("договориться" между собой об очерёдности действий)
Для работы с событиями в windows используются (в частности) следующие функции=
- CreateEvent()- создает объект-событие - имеется возможность определить - как именно будет "сбрасываться" событие.
- SetEvent() - устанавливает событие в сигнальное состояние
- ResetEvent() - сбрасывает событие - то есть переводит его "в не сигналящее" состояние - как бы "отменяет актуальность" (если сравнивать с "жизненными" событиями)))
- PulseEvent() - устанавливает событие - в смысле - переводит объект-событие в "сигналящее" состояние ,а затем- после возобновления ожидающих это событие нитей (всех при ручном сбросе и только одной при автоматическом), сбрасывает его (см. предыдущую в списке функцию - ResetEvent() ). Если ожидающих нитей нет, PulseEvent просто сбрасывает событие.
Пример синхронизации с помощью событий (код отсюда - я просто прокомментирую) =
#include stdio.h> /* заголовочный файл стандартного ввода-вывода -в том числе определят тип FILE */
#include windows.h> /* подключаем определение функций винды */
HANDLE hEvent1, hEvent2; /* объявляем пару глобальных дескрипторов - фактически указателей на любой тип */
int a[5];
HANDLE hThr;
unsigned long uThrID;
void Thread( void* pParams ) // эта функция будет выполняться в контексте потока, созданного в main(void) функции
{
int i, num = 0;
while (1) // запускаем бесконечный цикл
{
WaitForSingleObject( hEvent2, INFINITE ); /* приостанавливаем выполнение программы до того времени пока hEvent2
не окажется в сигнальном состоянии (а он при достижении данной "строчки" уже будет прибывать именно в
сигнальном состоянии) -вообще в данной программе в обеих функциях
проверки WaitForSingleObject не остановят выполнение ни на миг ,так как оба объекта-события main
и hEvent2 будут заблоговременно переводится в сигнальное состояние
hEvent2- фукции main() , а hEvent1 в функции Thread() */
for (i=0; i<5; i++) a[i] = num; // присваиваем каждому элементу массива значение = переменной num
num++; // наращиваем значение num на единицу
SetEvent( hEvent1 );// переводим hEvent1 в сигнальное состояние
}
}
/*примечание = http://fkn.ktu10.com/?q=node/642 */
int main( void ) // НАЧАЛО ПРОГРАММЫ - новый поток будет запущен из контекста этой функции
{
hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL ); /* событие создаётся в сигнальном состоянии , с автоматическим сбросом*/
hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL ); /* событие создаётся в НЕсигнальном состоянии , с автоматическим сбросом */
hThr=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Thread,NULL,0,&uThrID);
while(1) // запускаем бесконечный цикл
{
WaitForSingleObject( hEvent1, INFINITE ); /* эта функция дожидатся момента,
когда событие hEvent1 окажется в "сигнальном состоянии" (изначально событие уже в этом состоянии)
- и только после этого продолжит выполнение программы -
при этом после продолжения работы hEvent1 будет "сброшено" так как оно
создано как "автоматически сбрасываемое (см. примечание )"*/
Sleep( 1000 ); /* это мой дополнение к исходному коду - подождём секунду , а затем выводим строчку , а то всё слишком бчстро)) */
printf("%d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4]); // выводим на экран строчку одинакых чисел равных переменной num
SetEvent( hEvent2 ); // переводим hEvent2 в сигнальное состояние
}
return 0;
}
ПРИМЕЧАНИЕ
О приведении типа LPTHREAD_START_ROUTINE читайте здесь
_____________________________________________
Источники(читать подробнее)=
http://www.codeproject.com/KB/threads/AutoManualResetEvents.aspx
http://www.codenet.ru/progr/cpp/process-threads-sync.php
Ключевые слова и фразы(для поиска)=
Синхронизация нитей в ОС Windows
события си windows
work with events c winapi
события виндовс
- Log in to post comments
- 7889 reads