int pthread_rwlock_wrlock(pthread_rwlock_t
int pthread_rwlock_unlock(pthread_rwlock_t
/* Все функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Следующие две функции производят попытку заблокировать ресурс для чтения или записи, но если это невозможно, возвращают ошибку с кодом EBUSY, вместо того чтобы приостановить выполнение вызвавшего процесса:
#include pthread.h
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 pthread.h
int pthread_rwlock_init(pthread_rwlock_t
int pthread_rwlock_destroy(pthread_rwlock_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Если при инициализации блокировки чтения-записи
#include pthread.h
int pthread_rwlockattr_init(pthread_rwlockattr_t
int pthread_rwlockattr_destroy(pthread_rwlockattr_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
После инициализации объекта типа pthread_rwlockattr_t для установки или сброса отдельных атрибутов используются специальные функции. Единственный определенный на настоящее время атрибут — PTHREAD_PROCESS_SHARED, который указывает на то, что блокировка используется несколькими процессами, а не отдельными потоками одного процесса. Две приведенные ниже функции используются для получения и установки значения этого атрибута:
#include pthread.h
int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t
int pthread_rwlockattr_setpshared(pthread_rwlockattr_t
/* Обе функции возвращают 0 в случае успешного завершения, положительное значение Еххх – в случае ошибки */
Первая функция возвращает текущее значение в целом, на которое указывает аргумент
8.4. Реализация с использованием взаимных исключений и условных переменных
Для реализации блокировок чтения-записи достаточно использовать взаимные исключения и условные переменные. В этом разделе мы рассмотрим одну из возможных реализаций, в которой предпочтение отдается ожидающим записи потокам. Это не является обязательным; возможны альтернативы.