Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СП2_1 Синхронизация потоков.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
134.14 Кб
Скачать

События

1.

HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttrib,

BOOL fManualReset, BOOL flnitialState, LPCTSTR lpName);

2.

BOOL SetEvent(HANDLE hEvent);

3.

BOOL ResetEvent(HANDLE hEvent);

4.

BOOL PulseEvent(HANDLE hEvent);

5.

BOOL CloseHandle(HANDLE hEvent);

Примеры использования событий.

Пример 1. Два потока по очереди выполняют операции записи-чтения в блоке памяти. Используется одно событие с автосбросом.

HANDLE hEvent;

hEvent = CreateEvent( NULL, FALSE, TRUE, NULL );

// Функция потока 1

DWORD WINAPI ThreadFunc1(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent

WaitForSingleObject(hEvent, INFINITE);

// выполнение операций записи-чтения потоком 1

SetEvent( hEvent );

}

}

// Функция потока 2

DWORD WINAPI ThreadFunc2(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent

WaitForSingleObject(hEvent, INFINITE);

// выполнение операций записи-чтения потоком 2

SetEvent( hEvent );

}

}

Пример 2. Два потока параллельно выполняют операции чтения из блока памяти. Используется одно событие с ручным сбросом.

HANDLE hEvent;

hEvent = CreateEvent( NULL, TRUE, TRUE, NULL );

// Функция потока 1

DWORD WINAPI ThreadFunc1(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent

WaitForSingleObject(hEvent, INFINITE);

// выполнение операций чтения потоком 1

}

}

// Функция потока 2

DWORD WINAPI ThreadFunc2(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent

WaitForSingleObject(hEvent, INFINITE);

// выполнение операций чтения потоком 2

}

}

Пример 3. Два потока последовательно выполняют операции ввода данных и их обработки. Используются два события с автосбросом, одно в свободном состоянии, другое – в занятом.

HANDLE hEvent1, hEvent2;

hEvent1=CreateEvent( NULL, FALSE, TRUE, NULL );

hEvent2=CreateEvent( NULL, FALSE, FALSE, NULL );

// Функция потока 1

DWORD WINAPI ThreadFunc1(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent1

WaitForSingleObject(hEvent1, INFINITE);

// выполнение операций ввода данных потоком 1

// перевод события hEvent2 в свобод. состояние

SetEvent(hEvent2);

}

}

// Функция потока 2

DWORD WINAPI ThreadFunc2(PVOID pvParam)

{

while (!p->stop)

{

// ожидание освождения события hEvent2

WaitForSingleObject(hEvent2, INFINITE);

// выполнение обработки данных потоком 2

// перевод события hEvent1 в свобод. состояние

SetEvent(hEvent1);

}

}

Ожидаемые таймеры

Ожидаемые таймеры (waitable timers) — это объекты ядра, которые самостоятельно переходят в свободное состояние в определенное время или через регулярные промежутки времени.

Ожидаемые таймеры бывают двух типов: со сбросом вручную и с автосбросом. Когда освобождается таймер со сбросом вручную, возобновляется выполнение всех потоков, ожидавших этот объект, а когда в свободное состояние переходит таймер с автосбросом — лишь одного из потоков.

Функции для работы с ожидаемыми таймерами следующие: