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

UptoLike

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

мент попытаются завладеть семафором, они будут приостановлены до тех пор, пока
счетчик захватов не будет декрементирован до значения ниже максимального.
Пока семафор (или исключающий семафор) существует, поток взаимодействует с
ним посредством операций захвата и освобождения. Для захвата любого объекта поток
вызывает функцию WaitForSingleObject (или одну из ее разновидностей). Завершив вы-
полнение задачи, которая синхронизировалась захваченным объектом, поток освобож-
дает этот объект с помощью одной из следующих функций:
BOOL ReleaseMutex( HANDLE hMutex ) ;
BOOL ReleaseSemaphore(
HANDLE hSemaphore,
LONG lRelease, // величина, на которую
// инкрементируется значение счетчика
// при освобождении объекта (обычно 1)
LPLONG lplPrevious ); // переменная, которой присваивается
// предыдущее значение счетчика
При освобождении семафора: или исключающего семафора значение счетчика за-
хватов инкрементируется. Значение счетчика, превышающее 0, воспринимается систе-
мой как сигнал объекта ожидающим его потокам.
Освободить исключающий семафор может только тот поток, который завладел им.
Однако любой поток может вызвать функцию ReleaseSemaphore, которая инкрементиру-
ет значение счетчика захватов обычного семафора вплоть до его максимального значе-
ния. Изменение значения счетчика дает возможность в процессе выполнения программы
произвольным образом задать количество потоков, которые могут завладеть семафором.
Обратите внимание, что функция CreateSemaphore позволяет при создании нового сема-
фора присвоить его счетчику значение, меньшее максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Такой прием
позволит заблокировать все потоки до тех пор, пока программа не произведет инициали-
зацию, а затем не увеличит значение счетчика с помощью команды ReleaseSemaphore.
Не забывайте вовремя освобождать синхронизирующие объекты. Не задав макси-
мального времени ожидания и забыв освободить исключающий семафор, вы заблоки-
руете все ожидающие его потоки.
Поток может ожидать несколько сигналов от одного и того же объекта, не будучи
заблокированным, однако после завершения каждого из процессов ожидания необходи-
мо, выполнять операцию освобождения. Это требование справедливо для семафоров,
исключающих семафоров и критических разделов.
Событие представляет собой объект, который создается программой при необхо-
димости информировать потоки о выполнении определенных действий. В простейшем
случае (ручной сброс) событие переключает свое состояние с помощью команд SetEvent
(сигнал включен) и ResetEvent (сигнал выключен). Когда сигнал включается, его полу-
чают все потоки, которые ожидают появления соответствующего события. Если сигнал
выключается, все такие потоки блокируются. В отличие от семафоров и исключающих
семафоров, события данного типа изменяют свое состояние только при подаче соответ-
ствующей команды каким-нибудь потоком.
События целесообразно использовать при условии, что поток должен выполняться
только после того, как программа обновит свое окно или пользователь введет опреде-
ленную информацию [12]. Ниже представлены основные функции, предназначенные для
работы с событиями:
73
мент попытаются завладеть семафором, они будут приостановлены до тех пор, пока
счетчик захватов не будет декрементирован до значения ниже максимального.
      Пока семафор (или исключающий семафор) существует, поток взаимодействует с
ним посредством операций захвата и освобождения. Для захвата любого объекта поток
вызывает функцию WaitForSingleObject (или одну из ее разновидностей). Завершив вы-
полнение задачи, которая синхронизировалась захваченным объектом, поток освобож-
дает этот объект с помощью одной из следующих функций:

BOOL ReleaseMutex( HANDLE hMutex ) ;

BOOL ReleaseSemaphore(
     HANDLE hSemaphore,
     LONG lRelease,                   // величина, на которую
                                      // инкрементируется значение счетчика
                                      // при освобождении объекта (обычно 1)
      LPLONG lplPrevious );           // переменная, которой присваивается
                                      // предыдущее значение счетчика

     При освобождении семафора: или исключающего семафора значение счетчика за-
хватов инкрементируется. Значение счетчика, превышающее 0, воспринимается систе-
мой как сигнал объекта ожидающим его потокам.
     Освободить исключающий семафор может только тот поток, который завладел им.
Однако любой поток может вызвать функцию ReleaseSemaphore, которая инкрементиру-
ет значение счетчика захватов обычного семафора вплоть до его максимального значе-
ния. Изменение значения счетчика дает возможность в процессе выполнения программы
произвольным образом задать количество потоков, которые могут завладеть семафором.
Обратите внимание, что функция CreateSemaphore позволяет при создании нового сема-
фора присвоить его счетчику значение, меньшее максимального. Например, при разра-
ботке нового семафора его счетчику можно задать начальное значение 0. Такой прием
позволит заблокировать все потоки до тех пор, пока программа не произведет инициали-
зацию, а затем не увеличит значение счетчика с помощью команды ReleaseSemaphore.
     Не забывайте вовремя освобождать синхронизирующие объекты. Не задав макси-
мального времени ожидания и забыв освободить исключающий семафор, вы заблоки-
руете все ожидающие его потоки.
     Поток может ожидать несколько сигналов от одного и того же объекта, не будучи
заблокированным, однако после завершения каждого из процессов ожидания необходи-
мо, выполнять операцию освобождения. Это требование справедливо для семафоров,
исключающих семафоров и критических разделов.
     Событие представляет собой объект, который создается программой при необхо-
димости информировать потоки о выполнении определенных действий. В простейшем
случае (ручной сброс) событие переключает свое состояние с помощью команд SetEvent
(сигнал включен) и ResetEvent (сигнал выключен). Когда сигнал включается, его полу-
чают все потоки, которые ожидают появления соответствующего события. Если сигнал
выключается, все такие потоки блокируются. В отличие от семафоров и исключающих
семафоров, события данного типа изменяют свое состояние только при подаче соответ-
ствующей команды каким-нибудь потоком.
     События целесообразно использовать при условии, что поток должен выполняться
только после того, как программа обновит свое окно или пользователь введет опреде-
ленную информацию [12]. Ниже представлены основные функции, предназначенные для
работы с событиями:



                                        73