Книга: UNIX: взаимодействие процессов
Функция sem_wait
Функция sem_wait
В листинге 10.33 приведен текст функции sem_wait, которая ожидает изменения значения семафора с 0 на положительное, после чего уменьшает его на 1.
Листинг 10.33. Функция sem_wait
//my_pxsem_mmap/sem_wait.с
1 #include "unpipc.h"
2 #include "semaphore.h"
3 int
4 mysem_wait(mysem_t *sem)
5 {
6 int n;
7 if (setn->sem_magic != SEM_MAGIC) {
8 errno = EINVAL;
9 return(-1);
10 }
11 if ((n = pthread_mutex_lock(&sem->sem_mutex)) != 0) {
12 errno = n;
13 return(-1);
14 }
15 while (sem->sem_count == 0)
16 pthread_cond_wait(&sem->sem_cond, &sem->sem_mutex);
17 sem->sem_count--;
18 pthread_mutex_unlock(&sem->sem_mutex);
19 return(0);
20 }
11-18 Прежде чем работать с семафором, нужно заблокировать соответствующее взаимное исключение. Если значение семафора 0, выполнение процесса приостанавливается в вызове pthread_cond_wait до тех пор, пока другой процесс не вызовет pthread_cond_signal для этого семафора, изменив его значение с 0 на 1. После того как значение становится ненулевым, мы уменьшаем его на 1 и разблокируем взаимное исключение.
- Функция sem_unlink
- Функция sem_close
- 10.3. Функции sem_wait и sem_trywait
- Функция sem_trywait
- 10.16. Реализация с использованием семафоров System V
- Синхронизация с помощью семафоров
- Мьютексы
- 10.14. Реализация с использованием FIFO
- 10.9. Несколько производителей, один потребитель
- Листинг 3.2. (system.c) Использование функции system()