Операционные системы. Учебное пособие. Марапулец Ю.В. - 70 стр.

UptoLike

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

// любого из объектов
DWORD dwMilliseconds, // максимальный период ожидания
BOOL bAlertable ); // TRUE - прекращение ожидания
// при завершении операции ввода/вывода
При успешном выполнении функции ожидания объект, сигнал от которого ожи-
дался, обычно определенным образом изменяется. Например, если поток ожидал и по-
лучил сигнал от исключающего семафора, функция восстанавливает несигнальное со-
стояние исключающего семафора, чтобы остальные потоки знали о том, что он занят.
Кроме того, функции ожидания декрементируют значение счетчика семафора и сбрасы-
вают информацию о некоторых событиях.
Функции ожидания не изменяют состояния указанного объекта до тех пор, пока не
поступит сигнал от одного или нескольких других объектов. В частности, поток не за-
хватывает исключающий семафор сразу же после поступления сигнала от него, а ожида-
ет сигналов от других объектов. Кроме того, в течение времени ожидания исключающий
семафор снова может быть захвачен другим потоком, который еще больше продлит со-
стояние ожидания.
Конечно, ожидать поступления сигнала от объекта можно лишь в том случае, если
этот объект уже создан. Начнем с создания исключающих семафоров и семафоров, по-
скольку для работы с ними существуют параллельные API-команды, позволяющие соз-
давать и уничтожать эти объекты, захватывать их и освобождать, а также получать их
дескрипторы.
Функциям, создающим исключающие семафоры и семафоры, нужно указать тре-
буемые привилегии доступа и начальные параметры создаваемого объекта (можно также
указать его имя, но это необязательно) [12].
HANDLE CreateMutex (
LPSECURITY_ATTRIBUTES lpsa, // необязательные атрибуты безопасно-
сти
BOOL bInitialOwner // TRUE - создатель хочет
// завладеть полученным объектом
LPTSTR lpszMutexName ) // имя объекта
HANDLE CreateSemaphore(
LPSECURITY_ATTRIBUTES lpsa, //необязательные атрибуты безопасности
LONG lInitialCount, // исходное значение счетчика (обычно 0)
LONG lMaxCount, // максимальное значение
// счетчика (ограничивает число потоков)
LPTSTR lpszSemName ); // имя семафора (может иметь значение NULL)
Если в качестве атрибута безопасности задано значение NULL, результирующий
дескриптор получит все привилегии доступа и не будет наследоваться дочерними про-
цессами. Имена объектов являются необязательными, однако они становятся полезными
в ситуации, когда несколько процессов управляют одним и тем же объектом.
Если флагу bInitialOwner присвоить значение TRUE, поток сразу после создания
объекта завладеет им. Созданный исключающий семафор не станет подавать сигналы до
тех пор, пока поток не освободит его.
В отличие от исключающего семафора, который может принадлежать только од-
ному потоку, неисключающий семафор остается в сигнальном состоянии до тех пор, по-
ка его счетчик захватов не получит значения iMaxCount. Если другие потоки в этот мо-
72
                                      // любого из объектов
      DWORD dwMilliseconds,           // максимальный период ожидания
      BOOL bAlertable );              // TRUE - прекращение ожидания
                                      // при завершении операции ввода/вывода

      При успешном выполнении функции ожидания объект, сигнал от которого ожи-
дался, обычно определенным образом изменяется. Например, если поток ожидал и по-
лучил сигнал от исключающего семафора, функция восстанавливает несигнальное со-
стояние исключающего семафора, чтобы остальные потоки знали о том, что он занят.
Кроме того, функции ожидания декрементируют значение счетчика семафора и сбрасы-
вают информацию о некоторых событиях.
      Функции ожидания не изменяют состояния указанного объекта до тех пор, пока не
поступит сигнал от одного или нескольких других объектов. В частности, поток не за-
хватывает исключающий семафор сразу же после поступления сигнала от него, а ожида-
ет сигналов от других объектов. Кроме того, в течение времени ожидания исключающий
семафор снова может быть захвачен другим потоком, который еще больше продлит со-
стояние ожидания.
      Конечно, ожидать поступления сигнала от объекта можно лишь в том случае, если
этот объект уже создан. Начнем с создания исключающих семафоров и семафоров, по-
скольку для работы с ними существуют параллельные API-команды, позволяющие соз-
давать и уничтожать эти объекты, захватывать их и освобождать, а также получать их
дескрипторы.
      Функциям, создающим исключающие семафоры и семафоры, нужно указать тре-
буемые привилегии доступа и начальные параметры создаваемого объекта (можно также
указать его имя, но это необязательно) [12].

HANDLE CreateMutex (
    LPSECURITY_ATTRIBUTES lpsa,        // необязательные атрибуты безопасно-
    сти
    BOOL bInitialOwner         // TRUE - создатель хочет
                               // завладеть полученным объектом
    LPTSTR lpszMutexName )     // имя объекта

HANDLE CreateSemaphore(
    LPSECURITY_ATTRIBUTES lpsa,        //необязательные атрибуты безопасности
    LONG lInitialCount,        // исходное значение счетчика (обычно 0)
    LONG lMaxCount,            // максимальное значение
                               // счетчика (ограничивает число потоков)
    LPTSTR lpszSemName );      // имя семафора (может иметь значение NULL)

     Если в качестве атрибута безопасности задано значение NULL, результирующий
дескриптор получит все привилегии доступа и не будет наследоваться дочерними про-
цессами. Имена объектов являются необязательными, однако они становятся полезными
в ситуации, когда несколько процессов управляют одним и тем же объектом.
     Если флагу bInitialOwner присвоить значение TRUE, поток сразу после создания
объекта завладеет им. Созданный исключающий семафор не станет подавать сигналы до
тех пор, пока поток не освободит его.
     В отличие от исключающего семафора, который может принадлежать только од-
ному потоку, неисключающий семафор остается в сигнальном состоянии до тех пор, по-
ка его счетчик захватов не получит значения iMaxCount. Если другие потоки в этот мо-



                                        72