Основы программирования в Win32API. Марапулец Ю.В. - 30 стр.

UptoLike

Составители: 

DWORD WaitForMultipleObjectsEx
(DWORD dwNumObjects, // количество ожидаемых объектов
LPHANDLE lpHandles, // массив дескрипторов
BOOL bWaitAll, // TRUE – ожидание сигналов
// сразу от всех объектов;
// FALSE – ожидание сигнала от любого из объектов
DWORD dwMilliseconds, // максимальный период ожидания
BOOL bAlertable, // TRUE – прекращение ожидания
// при завершении операции ввода/вывода);...
При успешном выполнении функции ожидания объект, сигнал от кото-
рого ожидался, обычно определенным образом изменяется. Если, например,
поток ожидал и получил сигнал от исключающего семафора, функция вос-
станавливает несигнальное состояние исключающего семафора, чтобы ос-
тальные потоки знали о том, что он занят. Кроме того, функции ожидания
декрементируют значение счетчика семафора и сбрасывают информацию о
некоторых
событиях.
Функции ожидания не изменяют состояния указанного объекта до тех пор,
пока не поступит сигнал от одного или нескольких других объектов. В частно-
сти, поток не захватывает исключающий семафор сразу же после поступления
сигнала от него, а ожидает сигналов от других объектов. Кроме того, в течение
времени ожидания исключающий семафор снова может быть захвачен другим
потоком, который еще больше продлит состояние ожидания.
Конечно, ожидать поступления сигнала от объекта можно лишь в том
случае, если этот объект уже создан. Начнем с создания семафоров и исклю-
чающих семафоров, поскольку для работы с ними существуют параллельные
API-команды, позволяющие создавать и уничтожать эти объекты, захватывать
их и освобождать, а также получать их дескрипторы.
2.4.2. Семафоры и исключающие семафоры
Функциям, создающим семафоры и исключающие семафоры, нужно ука-
зать требуемые привилегии доступа и начальные параметры создаваемого объ-
екта (можно также указать его имя, но это необязательно) [2]:
HANDLE CreateMutext
(LPSECURITY_ATTRIBUTES lpsa,
// необязательные атрибуты безопасности
BOOL bInitialOwner, // TRUE – создатель хочет
// завладеть полученным объектом
LPTSTR lpszMutexName, // имя объекта);
HANDLE CreateSemaphore
30
DWORD WaitForMultipleObjectsEx
          (DWORD dwNumObjects, // количество ожидаемых объектов
          LPHANDLE lpHandles,             // массив дескрипторов
          BOOL bWaitAll, // TRUE – ожидание сигналов
                                // сразу от всех объектов;
                   // FALSE – ожидание сигнала от любого из объектов
            DWORD dwMilliseconds, // максимальный период ожидания
            BOOL bAlertable,        // TRUE – прекращение ожидания
                         // при завершении операции ввода/вывода);...
     При успешном выполнении функции ожидания объект, сигнал от кото-
рого ожидался, обычно определенным образом изменяется. Если, например,
поток ожидал и получил сигнал от исключающего семафора, функция вос-
станавливает несигнальное состояние исключающего семафора, чтобы ос-
тальные потоки знали о том, что он занят. Кроме того, функции ожидания
декрементируют значение счетчика семафора и сбрасывают информацию о
некоторых
событиях.
     Функции ожидания не изменяют состояния указанного объекта до тех пор,
пока не поступит сигнал от одного или нескольких других объектов. В частно-
сти, поток не захватывает исключающий семафор сразу же после поступления
сигнала от него, а ожидает сигналов от других объектов. Кроме того, в течение
времени ожидания исключающий семафор снова может быть захвачен другим
потоком, который еще больше продлит состояние ожидания.
     Конечно, ожидать поступления сигнала от объекта можно лишь в том
случае, если этот объект уже создан. Начнем с создания семафоров и исклю-
чающих семафоров, поскольку для работы с ними существуют параллельные
API-команды, позволяющие создавать и уничтожать эти объекты, захватывать
их и освобождать, а также получать их дескрипторы.



                2.4.2. Семафоры и исключающие семафоры

     Функциям, создающим семафоры и исключающие семафоры, нужно ука-
зать требуемые привилегии доступа и начальные параметры создаваемого объ-
екта (можно также указать его имя, но это необязательно) [2]:
HANDLE CreateMutext
       (LPSECURITY_ATTRIBUTES lpsa,
                    // необязательные атрибуты безопасности
       BOOL bInitialOwner,          // TRUE – создатель хочет
                                      // завладеть полученным объектом
       LPTSTR lpszMutexName,             // имя объекта);
HANDLE CreateSemaphore

                                     30