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

UptoLike

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

(LPSECURITY_ATTRIBUTES lpsa,
//необязательные атрибуты безопасности
LONG UnitialCount, // исходное значение счетчика (обычно 0)
LONG lMaxCount, // максимальное значение
// счетчика (ограничивает число потоков)
LPTSTR lpszSemName, // имя семафора (может иметь
// значение NULL);…
Если в качестве атрибута безопасности задано значение NULL, результи-
рующий дескриптор получит все привилегии доступа и не будет наследоваться
дочерними процессами. Имена объектов являются необязательными, однако
они становятся полезными в ситуации, когда несколько процессов управляют
одним и тем же объектом.
Если флагу bInitialOwner присвоить значение TRUE,
поток сразу после
создания объекта завладеет им. Созданный исключающий семафор не станет
подавать сигналы до тех пор, пока поток не освободит его.
В отличие от исключающего семафора, который может принадлежать толь-
ко одному потоку, неисключающий семафор остается в сигнальном состоянии до
тех пор, пока его счетчик захватов не получит значения iMaxCount. Если другие
потоки в этот момент попытаются завладеть семафором, они будут приостанов-
лены до тех пор, пока счетчик захватов не будет декрементирован до значения
ниже максимального.
Пока семафор (или исключающий семафор) существует, поток взаимо-
действует с ним посредством операций захвата и освобождения. Для захвата
любого объекта поток вызывает функцию WaitForSingleObject (или одну из ее
разновидностей). Завершив выполнение задачи, которая синхронизировалась
захваченным объектом, поток освобождает этот объект с помощью одной из
следующих функций:
BOOL ReleaseMutex( HANDLE hMutex ) ;
BOOL ReleaseSemaphore
(HANDLE hSemaphore,
LONG lRelease, // величина, на которую инкрементируется
//значение счетчика при освобождении объекта (обычно 1)
LPLONG lplPrevious, // переменная, которой присваивается
// предыдущее значение счетчика);…
При освобождении семафора или исключающего семафора значение
счетчика захватов инкрементируется. Значение счетчика, превышающее 0,
воспринимается системой как сигнал объекта ожидающим его потокам.
Освободить исключающий семафор может только тот поток, который за-
владел им. Однако любой поток может вызвать функцию ReleaseSemaphore(),
которая инкрементирует значение счетчика захватов обычного семафора
вплоть до его максимального значения. Изменение значения счетчика дает
возможность в процессе выполнения программы произвольным образом задать
31
          (LPSECURITY_ATTRIBUTES lpsa,
                     //необязательные атрибуты безопасности
          LONG UnitialCount, // исходное значение счетчика (обычно 0)
          LONG lMaxCount,        // максимальное значение
                               // счетчика (ограничивает число потоков)
          LPTSTR lpszSemName, // имя семафора (может иметь
                                  // значение NULL);…
     Если в качестве атрибута безопасности задано значение NULL, результи-
рующий дескриптор получит все привилегии доступа и не будет наследоваться
дочерними процессами. Имена объектов являются необязательными, однако
они становятся полезными в ситуации, когда несколько процессов управляют
одним и тем же объектом.
     Если флагу bInitialOwner присвоить значение TRUE, поток сразу после
создания объекта завладеет им. Созданный исключающий семафор не станет
подавать сигналы до тех пор, пока поток не освободит его.
     В отличие от исключающего семафора, который может принадлежать толь-
ко одному потоку, неисключающий семафор остается в сигнальном состоянии до
тех пор, пока его счетчик захватов не получит значения iMaxCount. Если другие
потоки в этот момент попытаются завладеть семафором, они будут приостанов-
лены до тех пор, пока счетчик захватов не будет декрементирован до значения
ниже максимального.
     Пока семафор (или исключающий семафор) существует, поток взаимо-
действует с ним посредством операций захвата и освобождения. Для захвата
любого объекта поток вызывает функцию WaitForSingleObject (или одну из ее
разновидностей). Завершив выполнение задачи, которая синхронизировалась
захваченным объектом, поток освобождает этот объект с помощью одной из
следующих функций:
BOOL ReleaseMutex( HANDLE hMutex ) ;
BOOL ReleaseSemaphore
    (HANDLE hSemaphore,
    LONG lRelease,     // величина, на которую инкрементируется
               //значение счетчика при освобождении объекта (обычно 1)
    LPLONG lplPrevious,              // переменная, которой присваивается
                                    // предыдущее значение счетчика);…

    При освобождении семафора или исключающего семафора значение
счетчика захватов инкрементируется. Значение счетчика, превышающее 0,
воспринимается системой как сигнал объекта ожидающим его потокам.
    Освободить исключающий семафор может только тот поток, который за-
владел им. Однако любой поток может вызвать функцию ReleaseSemaphore(),
которая инкрементирует значение счетчика захватов обычного семафора
вплоть до его максимального значения. Изменение значения счетчика дает
возможность в процессе выполнения программы произвольным образом задать
                                     31