pthread_rwlock_rdlock 或 pthread_rwlock_tryrdlock 子例程

用途

锁定 read-write 锁定对象以进行读取。

线程库 (libpthreads.a)

语法

#include <pthread.h>

int pthread_rwlock_rdlock (rwlock)
pthread_rwlock_t *rwlock;

int pthread_rwlock_tryrdlock (rwlock)
pthread_rwlock_t *rwlock;

描述

pthread_rwlock_rdlock 函数将读锁定应用于 rwlock引用的 read-write 锁定。 如果写程序未持有锁定,并且没有任何写程序被锁定,那么调用线程将获取 read 锁定。 未指定在写程序没有保留该锁且有写程序在等待该锁时调用线程是否要获取该锁。 如果写程序保留了该锁,调用线程将不会获取该读取锁。 如果未获取读锁定,那么调用线程块 (即,它不会从 pthread_rwlock_rdlock call返回) ,直到它可以获取锁定为止。 如果调用线程在执行调用时持有 rwlock 上的写锁定,那么结果未定义。

为了避免作家饥饿,允许实现偏向作家而不是读者。

一个线程可能在 rwlock 上持有多个并发读锁定 (即,成功调用 pthread_rwlock_rdlock 函数 n 次)。 如果是这样,那么线程必须执行匹配的解锁 (即,它必须调用 pthread_rwlock_unlock 函数 n 次)。

函数 pthread_rwlock_tryrdlock 会像在 pthread_rwlock_rdlock 函数中一样应用读锁定,但如果任何线程在 rwlock 上持有写锁定或者有写程序在 rwlock上受阻,那么该函数会失败。

如果使用未初始化的 read-write 锁定调用其中任何函数,那么结果将未定义。

如果将信号传递到等待 read-write 锁定以进行读取的线程,那么当从信号处理程序返回时,该线程将继续等待 read-write 锁定以进行读取,就好像它未中断一样。

参数

表 1. 参数
描述
rwlock 指定要锁定以进行读取的 read-write 锁定。

返回值

如果成功, pthread_rwlock_rdlock 函数将返回零。 否则,将返回错误号以指示错误。

如果获取了用于读取 rwlock 所引用的 read-write 锁定对象的锁定,那么函数 pthread_rwlock_tryrdlock 将返回零。 否则,将返回错误号以指示错误。

错误代码

pthread_rwlock_tryrdlock 函数在以下情况下失败:

表 2。 pthread_rwlock_tryrdlock 错误代码
描述
EBUSY 可能无法获取 read-write 锁定以进行读取,因为写程序持有该锁定或在该锁定上被阻止。

pthread_rwlock_rdlockpthread_rwlock_tryrdlock 函数在以下情况下失败:

表 3。 pthread_rwlock_rdlockpthread_rwlock_tryrdlock 错误代码
描述
EINVAL rwlock 指定的值未引用已初始化的 read-write 锁定对象。
EDEADLK 当前线程已拥有用于写入的 read-write 锁定。
EAGAIN 可能无法获取 read 锁定,因为超过了 rwlock 的最大读锁定数。

实现细节

使用 read-write 锁定时,实时应用程序可能会迂到优先级反转。 当高优先级线程 "锁定" 即将由低优先级线程 "解锁" 的 read-write 锁定,但低优先级线程被中优先级线程抢占时,会发生此问题。 此场景会导致优先级反转; 高优先级线程将被低优先级线程无限地阻塞。 在系统设计过程中,实时程序员必须考虑到这种优先级反转的可能性。 它们可以通过几种方法来处理此问题,例如,让由 read-write 锁定保护的关键部分以高优先级执行,以便在其关键部分中执行时不能抢占线程的先机。