Книга: UNIX: взаимодействие процессов
10.3. Функции sem_wait и sem_trywait
10.3. Функции sem_wait и sem_trywait
Функция sem_wait проверяет значение заданного семафора на положительность, уменьшает его на единицу и немедленно возвращает управление процессу. Если значение семафора при вызове функции равно нулю, процесс приостанавливается, до тех пор пока оно снова не станет больше нуля, после чего значение семафора будет уменьшено на единицу и произойдет возврат из функции. Ранее мы отметили, что операция «проверка и уменьшение» должна быть атомарной по отношению к другим потокам, работающим с этим семафором:
#include <semaphore.h>
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
/* Обе функции возвращают 0 в случае успешного завершения. –1 – в случае ошибки */
Разница между sem_wait и sem_trywait заключается в том, что последняя не приостанавливает выполнение процесса, если значение семафора равно нулю, а просто немедленно возвращает ошибку EAGAIN.
Возврат из функции sem_wait может произойти преждевременно, если будет получен сигнал. При этом возвращается ошибка с кодом EINTR.
- 10.1.Введение
- 10.2. Функции sem_open, sem_close и sem_unlink
- 10.3. Функции sem_wait и sem_trywait
- 10.4. Функции sem_post и sem_getvalue
- 10.5. Простые примеры
- 10.6. Задача производителей и потребителей
- 10.7. Блокирование файлов
- 10.8. Функции sem_init и sem_destroy
- 10.9. Несколько производителей, один потребитель
- 10.10. Несколько производителей, несколько потребителей
- 10.11. Несколько буферов
- 10.12. Использование семафоров несколькими процессами
- 10.13. Ограничения на семафоры
- 10.14. Реализация с использованием FIFO
- 10.15. Реализация с помощью отображения в память
- 10.16. Реализация с использованием семафоров System V
- 10.17. Резюме
- Упражнения