pthread_rwlock_rdlock 或 pthread_rwlock_tryrdlock 子例程
用途
为读写锁对象加锁。
库
线程库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 引用的读写锁上。 如果写程序没有保留读取锁,且没有被该锁阻塞的写程序,那么调用线程获取该读取锁。 未指定在写程序没有保留该锁且有写程序在等待该锁时调用线程是否要获取该锁。 如果写程序保留了该锁,调用线程将不会获取该读取锁。 如果读锁未被获取,调用线程就会阻塞(即不从pthread_rwlock_rdlock 调用返回),直到它能获取该锁。 如果调用时调用线程持有rwlock上的写锁,则结果未定义。
为了避免作家饥饿,允许实现偏向作家而不是读者。
一个线程可以同时持有多个rwlock读锁(即成功调用pthread_rwlock_rdlock函数n次)。 如果是这样,线程必须执行匹配的解锁操作(即必须调用pthread_rwlock_unlock函数n次)。
函数 "pthread_rwlock_tryrdlock与 "pthread_rwlock_rdlock一样应用读锁,但如果任何线程在 "rwlock上持有写锁,或者 "rwlock上有写入程序被阻塞,则函数会失败。
如果有未初始化的读写锁而调用这些函数中的任一,其结果会是无法预料的。
如果向等待读写锁进行阅读的线程发送了信号,那么从信号处理器返回后,该线程会继续等待读写锁进行阅读,就像没有被中断一样。
参数
| 项 | 描述 |
|---|---|
| rwlock | 指定为读取而锁定的读写锁。 |
返回值
如果成功,pthread_rwlock_rdlock函数返回 0。 否则,将返回错误号以指示错误。
The function pthread_rwlock_tryrdlock returns zero if the lock for reading on the read-write lock object referenced by rwlock is acquired. 否则,将返回一个错误编号来表示错误。
错误代码
如果出现以下情况,pthread_rwlock_tryrdlock函数将失效:
| 项 | 描述 |
|---|---|
| EBUSY | 无法获取读写锁进行读取,因为有写入器持有该锁或该锁被阻塞。 |
如果出现以下情况,"pthread_rwlock_rdlock和 "pthread_rwlock_tryrdlock函数将失效:
| 项 | 描述 |
|---|---|
| EINVAL | rwlock指定的值不指向初始化的读写锁对象。 |
| EDEADLK | 当前线程已拥有写入的读写锁。 |
| EAGAIN | 由于超过了rwlock读锁的最大数量,因此无法获取读锁。 |
实现细节
实时应用程序在使用读写锁时,可能会遇到优先级倒置的问题。 当高优先级线程 "锁定 "了低优先级线程即将 "解锁 "的读写锁,但低优先级线程被中优先级线程抢占时,问题就出现了。 这种情况会导致优先级倒置;高优先级线程被低优先级线程阻塞的时间不受限制。 在系统设计过程中,实时程序员必须考虑到这种优先级倒置的可能性。 他们可以用多种方法来解决这个问题,比如让被读写锁保护的关键部分以高优先级执行,这样线程在其关键部分执行时就不会被抢占。