Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
28
Добавлен:
17.04.2013
Размер:
129.54 Кб
Скачать

10

СПО Лекция 9,10[28.02.17]

Лекция 9,10. Примитивы синхронизации вWin32 api

  • Функции ожидания

  • Взаимное исключение (mutex)

  • Семафор

  • Событие

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

  • Магистраль (pipe)

Функции ожидания

Win32 ® API обеспечивает, набор функций WaitForxxx, позволяющих нити блокировать собственное выполнение.

Эти функции переводят вызывающую нить в состояние ожидания, пока указанные критерии не будут выполнены.

Функция WaitForSingleObject требует дескриптор одного объекта синхронизации. Эта функция возвращает управление нити, когда выполняется одно из следующих условий:

  • Указанный объект переходит в состоянии "сигнализирован".

  • Истекает таймаут. Время ожидания может быть бесконечным.

DWORD WaitForSingleObject(

HANDLE hHandle, // объект

DWORD dwMilliseconds // таймуат в мс

);

Функция WaitForMultipleObjects дает возможность определить массив, содержащий один или большее количество дескрипторов объектов. Эта функции возвращает управление нити, когда выполняется одно из следующих условий:

  • Состояние одного из указанных объектов становится "сигнализированным". (параметр fWaitAll = false).

  • Состояние всех указанных объектов становится "сигнализированным" (параметр fWaitAll = true).

  • Истекает таймаут ожидания.

Возвращаемое функцией значение является индексом объекта, перешедшего в сигнальное состояние, или указывает на выход по таймауту.

DWORD WaitForMultipleObjects(

DWORD nCount, // размер массива объектов

CONST HANDLE *lpHandles, // указатель на массив объектов

BOOL fWaitAll, // флаг режима ожидания

DWORD dwMilliseconds // таймаут в мс

);

Взаимное исключение (mutex)

Объект mutex - объект синхронизации, состояние которого становится «сигнализированным», когда объект не принадлежит никакой нити, и «несигнализированным», когда объект принадлежит какой-либо нити. Только одна нить одновременно может владеть объектом mutex.

Чтобы захватить mutex, нить должна использовать одну из wait функций. Если объект mutex принадлежит другой нити, выполнение нити блокируется до освобождения объекта функцией ReleaseMutex. Нити, ожидающие освобождение mutex, упорядочиваются в очереди в порядке поступления (FIFO)..

Объект создается при вызове функции CreateMutex. В параметрах функции можно установить режим захвата объекта в момент его создания. Нити в других процессах могут открывать дескриптор для доступа к существующему объекту mutex, определяя его имя в параметрах функции OpenMutex. Последнее справедливо для всех объектов синхронизации: объекты без имени могут использоваться только для синхронизации нитей в контексте одного процесса, а объекты с именем– для синхронизации нитей, принадлежащих разным процессам.

Пример:

// Процесс А: создает Mutex с именем « NameOfObject ».

HANDLE hMutex;

DWORD dwErr;

hMutex = CreateMutex( NULL, // атрибуты защиты не заданы

FALSE, // создается «свободным»

"NameOfObject"); // имя объекта

if (hMutex == NULL)

printf("CreateMutex error: %d\n", GetLastError() );

else

if ( GetLastError() == ERROR_ALREADY_EXISTS )

printf("CreateMutex opened existing mutex\n");

else

printf("CreateMutex created new mutex\n");

// Процесс В: открывает доступ к существующему объекту.

HANDLE hMutex;

hMutex = OpenMutex( MUTEX_ALL_ACCESS, // доступ без ограничений

FALSE, // описатель не наследуемый

"NameOfObject"); // имя объекта

if (hMutex == NULL)

printf("OpenMutex error: %d\n", GetLastError() );

Соседние файлы в папке вар1