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

Функция pthread_rwlock_init

Функция pthread_rwlock_init

Первая функция, pthread_rwlock_init, динамически инициализирует блокировку чтения-записи. Ее текст приведен в листинге 8.2.

7-8 Присваивание атрибутов с помощью этой функции не поддерживается, поэтому мы проверяем, чтобы указатель attr был нулевым.

9-19 Мы инициализируем взаимное исключение и две условные переменные, которые содержатся в нашей структуре. Все три счетчика устанавливаются в 0, а полю rw_magiс присваивается значение, указывающее на то, что структура была проинициализирована.

20-25 Если при инициализации взаимного исключения или условной переменной возникает ошибка, мы аккуратно уничтожаем проинициализированные объекты и возвращаем код ошибки.

Листинг 8.2. Функция pthread_rwlock_init: инициализация блокировки чтения-записи

//my_rwlock/pthread_rwlock_init.с
1  #include "unpipc.h"
2  #include "pthread_rwlock.h"
3  int
4  pthread_rwlock_init(pthread_rwlock_t *rw, pthread_rwlockattr_t *attr)
5  {
6   int result;
7   if (attr != NULL)
8    return(EINVAL); /* not supported */
9   if ((result = pthread_mutex_init(&rw->rw_mutex, NULL)) != 0)
10   goto err1;
11  if ((result = pthread_cond_init(&rw->rw_condreaders, NULL)) != 0)
12   goto err2;
13  if ((result = pthread_cond_init(&rw->rw_condwriters, NULL)) != 0)
14   goto err3;
15  rw->rw_nwaitreaders = 0;
16  rw->rw_nwaitwriters = 0;
17  rw->rw_refcount = 0;
18  rw->rw_magic = RW_MAGIC;
19  return(0);
20 err3:
21  pthread_cond_destroy(&rw->rw_condreaders);
22 err2;
23  pthread_mutex_destroy(&rw->rw_mutex);
24 err1:
25  return(result); /* значение errno */
26 }

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


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