Третья функция из группы предусматривает завершение блокировки ожидания освобождения объекта синхронизации при возникновении блокировки по записи или по истечении заданного тайм-аута ожидания.
Функция pthread_rwlock_timedrdlock()
EAGAIN
EDEADLK
EINVAL
rwl указывает на неинициализированный объект блокировки чтения/записи, либо время тайм-аута abs задано меньше нуля или равно или выше предельного значения 1000 миллионов;ETIMEDOUT
int pthread_rwlock_wrlock(pthread_rwlock_t* rwl);
int pthread_rwlock_trywrlock(pthread_rwlock_t* rwl);
int pthread_rwlock_timedwrlock(pthread_rwlock_t* rwlock,
const struct timespec* abs_timeout);
Функции этой группы предназначены для эксклюзивного захвата объекта синхронизации и использования его для блокирования по записи. Блокировка по записи, в отличие от блокировки по чтению, не допускает совместного исполнения защищаемого участка кода (ни пишущими, ни читающими потоками). Так же как в группе функций блокировки по чтению, в этой группе присутствуют функции простого захвата, попытки захвата и захвата с тайм-аутом ожидания освобождения.
Функция pthread_rwlock_wrlock()
EOK
EAGAIN
PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;EDEADLK
EFAULT
rwl;EINVAL
rwl указывает на неверный объект блокировки чтения/записи.Функция pthread_rwlock_trywrlock()
EOK
EAGAIN
PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;EBUSY
EDEADLK
EFAULT
rwl;EINVAL
rwl указывает на неверный объект блокировки чтения/записи.Функция pthread_rwlock_timedwrlock()
EOK
EAGAIN
EDEADLK
EINVAL
rwl указывает на неинициализированный объект блокировки чтения/записи, либо время тайм-аута abs задано меньше нуля или равно или выше предельного значения 1000 миллионов;ETIMEDOUT
Освобождение блокировки
int pthread_rwlock_unlock(pthread_rwlock_t* rwl);
Функция освобождает захваченный любым образом объект блокировки чтения/записи. Если объект был захвачен в режиме множественного использования (блокировки по чтению), то количество его освобождений должно равняться количеству захватов.
Возвращаемые значения:
EOK
EAGAIN
PTHREAD_RWLOCK_INITIALIZER) недостаточно системных ресурсов для инициализации блокировки чтения/записи;EFAULT
rwl;EINVAL
rwl указывает на неверно инициированный объект блокировки чтения/записи;EPERM
rwl в режиме чтения или записи, или вызывающий поток не владеет блокировкой в режиме записи.Использование блокировок чтения/записи
Построим приложение, использующее блокировку чтения/записи (
#include
#include
#include
// сколь угодно сложные элементы внутренней базы данных