8.2. Получение и сброс блокировки чтения-записи
Блокировка чтения-записи имеет тип pthread_rwlock_t. Если переменная этого типа является статической, она может быть проинициализирована присваиванием значения константы PTHREAD_RWLOCK_INITIALIZER.
Функция pthread_rwlock_rdlock позволяет заблокировать ресурс для чтения, причем вызвавший процесс будет заблокирован, если блокировка чтения-записи уже установлена записывающим процессом. Функция pthread_rwlock_wrlock позволяет заблокировать ресурс для записи, причем вызвавший процесс будет заблокирован, если блокировка чтения-записи уже установлена каким-либо другим процессом (считывающим или записывающим). Функция pthread_rwlock_unlock снимает блокировку любого типа (чтения или записи):
#include
int pthread_rwlock_rdlock(pthread_rwlock_t
int pthread_rwlock_wrlock(pthread_rwlock_t
int pthread_rwlock_unlock(pthread_rwlock_t
/* Все функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Следующие две функции производят попытку заблокировать ресурс для чтения или записи, но если это невозможно, возвращают ошибку с кодом EBUSY, вместо того чтобы приостановить выполнение вызвавшего процесса:
#include
int pthread_rwlock_tryrdlock(pthread_rwlock_t
int pthread_rwlock_trywrlock(pthread_rwlock_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
8.3. Атрибуты блокировки чтения-записи
Мы уже отмечали, что статическая блокировка может быть проинициализирована присваиванием ей значения PTHREAD_RWLOCK_INITIALIZER. Эти переменные могут быть проинициализированы и динамически путем вызова функции pthread_rwlock_init.
Когда поток перестает нуждаться в блокировке, он может вызвать pthread_rwlock_ destroy:
#include
int pthread_rwlock_init(pthread_rwlock_t
int pthread_rwlock_destroy(pthread_rwlock_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Если при инициализации блокировки чтения-записи
#include
int pthread_rwlockattr_init(pthread_rwlockattr_t
int pthread_rwlockattr_destroy(pthread_rwlockattr_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
После инициализации объекта типа pthread_rwlockattr_t для установки или сброса отдельных атрибутов используются специальные функции. Единственный определенный на настоящее время атрибут — PTHREAD_PROCESS_SHARED, который указывает на то, что блокировка используется несколькими процессами, а не отдельными потоками одного процесса. Две приведенные ниже функции используются для получения и установки значения этого атрибута:
#include
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Первая функция возвращает текущее значение в целом, на которое указывает аргумент
8.4. Реализация с использованием взаимных исключений и условных переменных