通过读写锁,可以对受保护的共享资源进行并发读取和独占写入。读写锁是可以在读取或写入模式下锁定的单一实体。要修改资源,线程必须首先获取互斥写锁。必须释放所有读锁之后,才允许使用互斥写锁。
有关 Solaris 线程所实现的读写锁,请参见相似的同步函数-读写锁。
对数据库的访问可以使用读写锁进行同步。读写锁支持并发读取数据库记录,因为读操作不会更改记录的信息。要更新数据库时,写操作必须获取互斥写锁。
要更改缺省的读写锁属性,可以声明和初始化属性对象。通常,可以在应用程序开头的某个位置设置读写锁属性,设置在应用程序的起始位置可使属性更易于查找和修改。下表列出了本节中讨论的用来处理读写锁属性的函数。
表 4–8 读写锁属性例程
操作 |
相关函数说明 |
---|---|
初始化读写锁属性 | |
销毁读写锁属性 | |
设置读写锁属性 | |
获取读写锁属性 |
pthread_rwlockattr_init(3C) 使用实现中定义的所有属性的缺省值来初始化读写锁属性对象 attr。
#include <pthread.h> int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);
如果调用 pthread_rwlockattr_init 来指定已初始化的读写锁属性对象,则结果是不确定的。读写锁属性对象初始化一个或多个读写锁之后,影响该对象的任何函数(包括销毁)不会影响先前已初始化的读写锁。
如果成功,pthread_rwlockattr_init() 会返回零。否则,将返回用于指明错误的错误号。
ENOMEM
描述:内存不足,无法初始化读写锁属性对象。
pthread_rwlockattr_destroy(3C) 可用来销毁读写锁属性对象。
#include <pthread.h> int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);
在再次调用 pthread_rwlockattr_init() 重新初始化该对象之前,使用该对象所产生的影响是不确定的。实现可以导致 pthread_rwlockattr_destroy() 将 attr 所引用的对象设置为无效值。
如果成功,pthread_rwlockattr_destroy() 会返回零。否则,将返回用于指明错误的错误号。
EINVAL
描述:attr 指定的值无效。
pthread_rwlockattr_setpshared(3C) 可用来设置由进程共享的读写锁属性。
#include <pthread.h> int pthread_rwlockattr_setpshared(pthread_rwlockattr_t *attr, int pshared);
PTHREAD_PROCESS_SHARED
描述:允许可访问用于分配读写锁的内存的任何线程对读写锁进行处理。即使该锁是在由多个进程共享的内存中分配的,也允许对其进行处理。
PTHREAD_PROCESS_PRIVATE
描述:读写锁只能由某些线程处理,这些线程与初始化该锁的线程在同一进程中创建。如果不同进程的线程尝试对此类读写锁进行处理,则其行为是不确定的。由进程共享的属性的缺省值为 PTHREAD_PROCESS_PRIVATE。
如果成功,pthread_rwlockattr_setpshared() 会返回零。否则,将返回用于指明错误的错误号。
EINVAL
描述:attr 或 pshared 指定的值无效。
pthread_rwlockattr_getpshared(3C) 可用来获取由进程共享的读写锁属性。
#include <pthread.h> int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t *attr, int *pshared);
pthread_rwlockattr_getpshared() 从 attr 引用的已初始化属性对象中获取由进程共享的属性的值。
如果成功,pthread_rwlockattr_getpshared() 会返回零。否则,将返回用于指明错误的错误号。
EINVAL
描述:attr 或 pshared 指定的值无效。