10.4. Функции sem_post и sem_getvalue

10.4. Функции sem_post и sem_getvalue

После завершения работы с семафором поток вызывает sem_post. Как мы уже говорили в разделе 10.1, этот вызов увеличивает значение семафора на единицу и возобновляет выполнение любых потоков, ожидающих изменения значения семафора:

#include <semaphore.h>

int sem_post(sem_t *sem);

int sem_getvalue(sem_t *sem, int *valp);

/* Обе функции возвращают 0 в случае успешного завершения. –1 – в случае ошибки */ 

Функция sem_getvalue возвращает текущее значение семафора, помещая его в целочисленную переменную, на которую указывает valp. Если семафор заблокирован, возвращается либо 0, либо отрицательное число, модуль которого соответствует количеству потоков, ожидающих разблокирования семафора.

Теперь мы ясно видим отличия семафоров от взаимных исключений и условных переменных. Прежде всего взаимное исключение может быть разблокировано только заблокировавшим его потоком. Для семафоров такого ограничения нет: один из потоков может ожидать изменения значения семафора, чтобы потом уменьшить его с 1 до 0 (действие аналогично блокированию семафора), а другой поток может изменить значение семафора с 0 до 1, что аналогично разблокированию семафора.

Далее, поскольку любой семафор имеет некоторое значение, увеличиваемое операцией post и уменьшаемое операцией wait, поток может изменить его значение (например, увеличить с 0 до 1), даже если нет потоков, ожидающих его изменения. Если же поток вызывает pthread_cond_signal в отсутствие заблокированных при вызове pthread_cond_wait потоков, сигнал просто теряется.

Наконец, среди всех функций, работающих со средствами синхронизации — взаимными исключениями, условными переменными, блокировками чтения-записи и семафорами, только одна может быть вызвана из обработчика сигналов: sem_post.

ПРИМЕЧАНИЕ

Не следует рассматривать приведенный выше текст как доводы в пользу семафоров. Все средства синхронизации, обсуждаемые в этой книге — взаимные исключения, условные переменные, блокировки чтения-записи, семафоры и блокировка fcntl, обладают своими преимуществами и недостатками. Выбирать средства синхронизации для приложения следует с учетом их многочисленных особенностей. Из нашего сравнительного описания можно сделать вывод, что взаимные исключения больше приспособлены для блокировки, условные переменные — для ожидания, а семафоры — для того и другого, и последнее может привести к излишнему усложнению текста программы.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Функции

Из книги Эффективное делопроизводство автора Пташинский Владимир Сергеевич

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


Функция sem_post

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Функция sem_post В листинге 10.25 приведен текст функции sem_post, которая увеличивает значение семафора.11-12 Мы записываем один байт в FIFO. Если канал был пуст, это приведет к возобновлению выполнения всех процессов, заблокированных в вызове read для этого канала.Листинг 10.25. Функция


Функция sem_post

Из книги MySQL: руководство профессионала автора Паутов Алексей В

Функция sem_post В листинге 10.32 приведен текст функции sem_post, которая увеличивает значение семафора, возобновляя выполнение всех процессов, заблокированных в ожидании этого события.Листинг 10.32. Функция sem_post//my_pxsem_mmap/sem_post.с1  #include "unpipc.h"2  #include "semaphore.h"3  int4  mysem_post(mysem_t


Функция sem_getvalue

Из книги TCP/IP Архитектура, протоколы, реализация (включая IP версии 6 и IP Security) автора Фейт Сидни М

Функция sem_getvalue В листинге 10.35 приведен текст последней функции в этой реализации — sem_getvalue. Она возвращает текущее значение семафора.11-16 Мы блокируем соответствующее взаимное исключение и считываем значение семафора.Листинг 10.35. Функция sem_getvalue//my_pxsem_mmap/sem_getvalue.c1  #include


Функция sem_post

Из книги Справочник по PHP автора

Функция sem_post В листинге 10.41 приведен текст функции sem_post, которая увеличивает значение семафора.11-16 Мы вызываем semop с операцией, увеличивающей значение семафора на 1.Листинг 10.41. Функция sem_post//my_pxsem_svsem/sem_post.с1  #include "unpipc.h"2  #include "semaphore.h"3  int4  mysem_post(mysem_t *sem)5  {6   struct sembuf


Функция sem_getvalue

Из книги Курс "Язык программирования PHP" автора Савельева Нина Владимировна

Функция sem_getvalue Последняя функция приведена в листинге 10.44. Это функция sem_getvalue, возвращающая текущее значение семафора.11-14 Текущее значение семафора получается отправкой команды GETVAL функции semctl.Листинг 10.44. Функция sem_getvalue//my_pxsem_svsem/sem_getvalue.с1  #include "unpipc.h"2  #include


4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации

Из книги Технология XSLT автора Валиков Алексей Николаевич

4.5.3. Функции, которые создают новые конфигурации из существующих 4.5.3.1. Функции геометрии, которые производят новые конфигурации Раздел "4.5.2. Функции Geometry" обсуждает несколько функций, которые создают новые конфигурации из


10.16 Функции TCP

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

10.16 Функции TCP Данная глава посвящена многочисленным функциям TCP. Ниже перечислены основные из них:? Связывание портов с соединениями? Инициализация соединений посредством трехшагового подтверждения? Выполнение медленного старта, исключающего перегрузку


Функции URL

Из книги C++ для начинающих автора Липпман Стенли


Функции в PHP

Из книги Разработка ядра Linux автора Лав Роберт


Функции

Из книги Конец холивара. Pascal vs C автора Кривцов М. А.

Функции В табл. П3.1–П3.5 представлено описание наиболее часто используемых функций.Таблица П3.1. Булевые функции Функция Описание boolean boolean(object) Явным образом преобразует объект, который ей передается в булевый тип boolean not(boolean) Выполняет логическое


8.6. Функции

Из книги автора

8.6. Функции Оператор определения функции имеет следующий синтаксис:[function] имя() { список}Определять функцию можно в любом месте сценария, но вызов ее должен осуществляться строго после описания. Вызывается функция подобно любой команде — по имени. Переданные ей аргументы


7. Функции

Из книги автора

7. Функции Мы рассмотрели, как объявлять переменные (глава 3), как писать выражения (глава 4) и инструкции (глава 5). Здесь мы покажем, как группировать эти компоненты в определения функций, чтобы облегчить их многократное использование внутри программы. Мы увидим, как


Функции

Из книги автора

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


3.1. Функции

Из книги автора

3.1. Функции Пример 1.7: Функция вычисляющая факториал.VAR A, Y : INTEGER;FUNCTION FAKTORIAL (N : INTEGER) : INTEGER; VAR F, K : INTEGER; BEGIN F := 1; FOR K := 1 TO N DO F := F * K; FAKTORIAL := F END; BEGINWRITELN (‘ВВЕДИТЕ ЦЕЛОЕ ПОЛОЖИТЕЛЬНОЕ ЧИСЛО’);READLN (A);Y := FAKTORIAL (A);WRITELN (‘N!=’, Y);READLN;READLNEND.Обратите внимание на то, что в описании функции