pthread_rwlock_wrlock 或 pthread_rwlock_trywrlock 子例程

用途

锁定读写锁对象,以便写入。

线程库libpthreads.a

语法

#include <pthread.h>

int pthread_rwlock_wrlock (rwlock)
pthread_rwlock_t *rwlock;

int pthread_rwlock_trywrlock (rwlock)
pthread_rwlock_t *rwlock;

描述

pthread_rwlock_wrlock子程序将写锁应用于rwlock 引用的读写锁。 如果没有其他线程(读写器)持有读写锁rwlock,调用线程就会获得写锁。 否则,线程将阻塞(即不从pthread_rwlock_wrlock调用返回),直到它能获取锁。 如果调用线程在进行调用时保留该读写锁(无论是读取锁还是写入锁),那么结果是不确定的。

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

pthread_rwlock_trywrlock子程序会像 "pthread_rwlock_wrlock子程序一样应用写锁,但如果任何线程当前持有 "rwlock(用于读取或写入),则函数会失败。

如果有未初始化的读写锁而调用这些函数中的任一,其结果会是无法预料的。

如果向等待读写锁进行写操作的线程发送了信号,从信号处理器返回后,线程会继续等待读写锁进行写操作,就像没有被中断一样。

实时应用程序在使用读写锁时,可能会遇到优先级倒置的问题。 当高优先级线程 "锁定 "了低优先级线程即将 "解锁 "的读写锁,但低优先级线程被中优先级线程抢占时,问题就出现了。 此场景导致优先级反转; 高优先级线程被低优先级线程阻塞了无限周期。 在系统设计过程中,实时程序员必须考虑到这种优先级反转的可能性。 他们可以通过多种方法来解决这个问题,比如让由读写锁保护的关键部分以高优先级执行,这样线程在其关键部分执行时就不会被抢占。
注:读者多而作家相对较少,可能会出现作家饥饿的现象。 如果线程正在等待读写锁上的独占写锁,而当前有线程持有共享读锁,则后续获取共享读锁的尝试会被批准,而获取独占写锁的尝试则会等待。

参数

描述
rwlock 指定要锁定写入的读写锁。

返回值

如果成功,pthread_rwlock_wrlock子程序返回 0。 否则,将返回错误号以指示错误。

如果rwlock引用的读写锁对象上的写入锁被获取,则pthread_rwlock_trywrlock子例程返回 0。 否则,将返回一个错误编号来表示错误。

错误代码

如果出现以下情况,pthread_rwlock_trywrlock子例程将失败:

描述
EBUSY 由于读写锁已被锁定,因此无法获取用于写入的读写锁。

如果出现以下情况,"pthread_rwlock_wrlock和 "pthread_rwlock_trywrlock子程序可能会失败:

描述
EINVAL rwlock指定的值不指向初始化的读写锁对象。
EDEADLK 当前线程已拥有写入或读取的读写锁。