Инициализировать блокировку чтения/записи
#include <pthread.h>int pthread_rwlock_init( pthread_rwlock_t *rwl,const pthread_rwlockattr_t *attr );
pthread_rwlock_t
, который требуется инициализировать.NULL
, или указатель на pthread_rwlockattr_t
, хранящую атрибуты, которые требуется использовать для блокировки чтения-записи; см. pthread_rwlockattr_init().libc
Функция pthread_rwlock_init() инициализирует блокировку чтения-записи, на которую ссылается rwl, с атрибутами attr. Необходимо инициализировать блокировки чтения-записи перед их использованием. Если attr равен NULL
, rwl инициализируется значениями по умолчанию.
Необходимо выделять объекты синхронизации только в обычной памяти. На некоторых процессорах (например, на некоторых 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
.
Более чем один поток может удерживать общую блокировку в любой момент времени, но только один поток может удерживать исключительную блокировку. Это позволяет избежать ожидания на чтение и запись во время частых запросов за счет:
В условиях жесткой конкуренции, блокировка чередуется между одной исключительной блокировкой, за которой следует пакет общих блокировок.
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 системной библиотеки