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

Функция pthread_rwlock_wrlock

Функция pthread_rwlock_wrlock

Текст функции pthread_rwlock_wrlock приведен в листинге 8.6.

11-17 Если ресурс заблокирован на считывание или запись (значение rw_refcount отлично от 0), мы приостанавливаем выполнение потока. Для этого мы увеличиваем rw_nwaitwriters и вызываем pthread_cond_wait с условной переменной rw_condwriters. Для этой переменной посылается сигнал при снятии блокировки чтения-записи, если имеются ожидающие разрешения на запись процессы.

18-19 После получения блокировки на запись мы устанавливаем значение rw_refcount в –1.

Листинг 8.6. Функция pthread_rwlock_wrlock: получение блокировки на запись

//my_rwlock/pthread_rwlock_wrlock.c
1  #include "unpipc.h"
2  #include "pthread_rwlock.h"
3  int
4  pthread_rwlock_wrlock(pthread_rwlock_t *rw)
5  {
6   int result;
7   if (rw->rw_magic != RW_MAGIC)
8    return(EINVAL);
9   if ((result = pthread_mutex_lock(&rw->rw_mutex)) != 0)
10   return(result);
11  while (rw->rw_refcount != 0) {
12   rw->rw_nwaitwriters++;
13   result = pthread_cond_wait(&rw->rw_condwriters, &rw->rw_mutex);
14   rw->rw_nwaitwriters--;
15   if (result != 0)
16    break;
17  }
18  if (result == 0)
19   rw->rw_refcount = –1;
20  pthread_mutex_unlock(&rw->rw_mutex);
21  return(result);
22 }

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


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