ПРИМЕР: Cинхронизация с помощью событий windows

События - объекты, оценивая состоянии которых , нити могут синхронизировать своё выполнение ("договориться" между собой об очерёдности действий)

Using Event Objects

Для работы с событиями в windows используются (в частности) следующие функции=

  1. CreateEvent()- создает объект-событие - имеется возможность определить - как именно будет "сбрасываться" событие.
  2. SetEvent() - устанавливает событие в сигнальное состояние
  3. ResetEvent() - сбрасывает событие - то есть переводит его "в не сигналящее" состояние - как бы "отменяет актуальность" (если сравнивать с "жизненными" событиями)))
  4. 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/Au...
http://www.codenet.ru/progr/cpp/process-...
Ключевые слова и фразы(для поиска)=
Синхронизация нитей в ОС Windows
события си windows
work with events c winapi
события виндовс