Книга: 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 и разблокируем взаимное исключение.

Оглавление книги


Генерация: 1.166. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз