записи) объекта синхронизации, на который ссылается rwl
, и повторный захват на чтение привел бы к полному («мертвому») блокированию потока;
EFAULT
— сбой при обращении ядра к rwl
;
EINVAL
— rwl
указывает на неверный объект блокировки чтения/записи.
Вторая из перечисленных функций проверяет, не находится ли соответствующий объект синхронизации в эксклюзивном использовании, и если это так, она возвращает соответствующее значение без последующего ожидания освобождения объекта синхронизации.
Функция pthread_rwlock_tryrdlock()
возвращает следующие значения:
EOK
— успешное выполнение;
EAGAIN
— при первом использовании статически инициированной блокировки чтения/записи (PTHREAD_RWLOCK_INITIALIZER
) недостаточно системных ресурсов для инициализации блокировки чтения/записи;
EBUSY
— блокировка чтения/записи блокирована по записи (собственно, это и есть основной мотив использования именно этого вызова);
EDEADLK
— вызывающий поток уже провел эксклюзивный захват (блокировку по записи) объекта синхронизации, на который ссылается rwl
;
EFAULT
— сбой при обращении ядра к rwl
;
EINVAL
— rwl
указывает на неверный объект блокировки чтения/записи.
Третья функция из группы предусматривает завершение блокировки ожидания освобождения объекта синхронизации при возникновении блокировки по записи или по истечении заданного тайм-аута ожидания.
Функция pthread_rwlock_timedrdlock()
может возвращать следующие коды ошибки:
EAGAIN
— система не может захватить блокировку по чтению, поскольку достигнуто максимальное число блокировок чтения для данного объекта;[37]
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
в режиме чтения или записи, или вызывающий поток не владеет блокировкой в режиме записи.