pthread_rwlock_init()

Инициализировать блокировку чтения/записи

Прототип:

#include <pthread.h>
int pthread_rwlock_init( pthread_rwlock_t *rwl,
const pthread_rwlockattr_t *attr );

Аргументы:

rwl
Указатель на объект pthread_rwlock_t, который требуется инициализировать.
attr
NULL, или указатель на pthread_rwlockattr_t, хранящую атрибуты, которые требуется использовать для блокировки чтения-записи; см. pthread_rwlockattr_init().

Библиотека:

libc

Описание:

Функция pthread_rwlock_init() инициализирует блокировку чтения-записи, на которую ссылается rwl, с атрибутами attr. Необходимо инициализировать блокировки чтения-записи перед их использованием. Если attr равен NULL, rwl инициализируется значениями по умолчанию.


Caution: Необходимо выделять объекты синхронизации только в обычной памяти. На некоторых процессорах (например, на некоторых PPC) атомарные операции, такие как блокировка, вызовут ошибку, если структура управления размещена в некэшированной памяти.

После успешного вызова pthread_rwlock_init(), блокировка чтения-записи разблокируется, и можно использовать ее в последующих вызовах pthread_rwlock_destroy(), pthread_rwlock_rdlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_trywrlock(), и pthread_rwlock_wrlock(). Эта блокировка остается пригодной для использования до ее уничтожения с использованием pthread_rwlock_destroy().

Если блокировка чтения-записи выделена статически, можно инициализировать ее значениями по умолчанию, установив для нее значение PTHREAD_RWLOCK_INITIALIZER.

Более чем один поток может удерживать общую блокировку в любой момент времени, но только один поток может удерживать исключительную блокировку. Это позволяет избежать ожидания на чтение и запись во время частых запросов за счет:

В условиях жесткой конкуренции, блокировка чередуется между одной исключительной блокировкой, за которой следует пакет общих блокировок.

Возвращаемое значение:

EOK
Успешное завершение.
EAGAIN
Недостаточно системных ресурсов для инициализации блокировки чтения-записи.
EBUSY
Блокировка чтения-записи rwl была инициализирована или безуспешно удалена.
EFAULT
Произошла ошибка при попытке ядра получить доступ к rwl или attr.
EINVAL
Недопустимый объект атрибутов блокировки чтения-записи attr.

Классификация:

POSIX 1003.1 Threads

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Да
В потоке
Да

Предостережения:

Следует остерегаться инверсии приоритета priority при использовании блокировок чтения-записи. Поток с более высоким приоритетом может быть заблокирован в ожидании блокировки чтения-записи, заблокированной потоком с низким приоритетом.

Микроядро не знает о блокировках чтения-записи и, следовательно, не может повысить приоритет низкоприоритетного потока, чтобы предотвратить инверсию приоритета.

Тематические ссылки:

pthread_rwlockattr_init(), pthread_rwlock_destroy(), pthread_rwlock_rdlock(), pthread_rwlock_tryrdlock(), pthread_rwlock_trywrlock(), pthread_rwlock_wrlock(), pthread_rwlock_unlock()




Предыдущий раздел: Описание API системной библиотеки