Книга: UNIX: взаимодействие процессов

Функция sem_trywait

Функция sem_trywait

В листинге 10.34 приведен текст функции sem_trywait, которая представляет собой просто неблокируемый вариант функции sem_wait.

11-22 Мы блокируем взаимное исключение и проверяем значение семафора. Если оно положительно, мы вычитаем из него 1 и возвращаем вызвавшему процессу код 0. В противном случае возвращается –1, а переменной errno присваивается код ошибки EAGAIN.

Листинг 10.34. Функция sem_trywait

//my_pxsem_nmap/sem_trywait.с
1  #include "unpipc.h"
2  #include "semaphore.h"
3  int
4  mysem_trywait(mysem_t *sem)
5  {
6   int n, rc;
7   if (sem->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  if (sem->sem_count > 0) {
16   sem->sem_count--;
17   rc = 0;
18  } else {
19   rc = –1;
20   errno = EAGAIN;
21  }
22  pthread_mutex_unlock(&sem->sem_mutex);
23  return(rc);
24 }

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


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