多线程编程指南

读写锁属性

通过读写锁,可以对受保护的共享资源进行并发读取和独占写入。读写锁是可以在读取写入模式下锁定的单一实体。要修改资源,线程必须首先获取互斥写锁。必须释放所有读锁之后,才允许使用互斥写锁。

有关 Solaris 线程所实现的读写锁,请参见相似的同步函数-读写锁

对数据库的访问可以使用读写锁进行同步。读写锁支持并发读取数据库记录,因为读操作不会更改记录的信息。要更新数据库时,写操作必须获取互斥写锁。

要更改缺省的读写锁属性,可以声明和初始化属性对象。通常,可以在应用程序开头的某个位置设置读写锁属性,设置在应用程序的起始位置可使属性更易于查找和修改。下表列出了本节中讨论的用来处理读写锁属性的函数。

表 4–8 读写锁属性例程

操作

相关函数说明

初始化读写锁属性 

pthread_rwlockattr_init 语法

销毁读写锁属性 

pthread_rwlockattr_destroy 语法

设置读写锁属性 

pthread_rwlockattr_setpshared 语法

获取读写锁属性 

pthread_rwlockattr_getpshared 语法

初始化读写锁属性

pthread_rwlockattr_init(3C) 使用实现中定义的所有属性的缺省值来初始化读写锁属性对象 attr

pthread_rwlockattr_init 语法

#include <pthread.h>



int pthread_rwlockattr_init(pthread_rwlockattr_t *attr);

如果调用 pthread_rwlockattr_init 来指定已初始化的读写锁属性对象,则结果是不确定的。读写锁属性对象初始化一个或多个读写锁之后,影响该对象的任何函数(包括销毁)不会影响先前已初始化的读写锁。

pthread_rwlockattr_init 返回值

如果成功,pthread_rwlockattr_init() 会返回零。否则,将返回用于指明错误的错误号。


ENOMEM

描述:

内存不足,无法初始化读写锁属性对象。

销毁读写锁属性

pthread_rwlockattr_destroy(3C) 可用来销毁读写锁属性对象。

pthread_rwlockattr_destroy 语法

#include <pthread.h>



int pthread_rwlockattr_destroy(pthread_rwlockattr_t *attr);

在再次调用 pthread_rwlockattr_init() 重新初始化该对象之前,使用该对象所产生的影响是不确定的。实现可以导致 pthread_rwlockattr_destroy()attr 所引用的对象设置为无效值。

pthread_rwlockattr_destroy 返回值

如果成功,pthread_rwlockattr_destroy() 会返回零。否则,将返回用于指明错误的错误号。


EINVAL

描述:

attr 指定的值无效。

设置读写锁属性

pthread_rwlockattr_setpshared(3C) 可用来设置由进程共享的读写锁属性。

pthread_rwlockattr_setpshared 语法

#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 返回值

如果成功,pthread_rwlockattr_setpshared() 会返回零。否则,将返回用于指明错误的错误号。


EINVAL

描述:

attrpshared 指定的值无效。

获取读写锁属性

pthread_rwlockattr_getpshared(3C) 可用来获取由进程共享的读写锁属性。

pthread_rwlockattr_getpshared 语法

#include <pthread.h>



int pthread_rwlockattr_getpshared(const pthread_rwlockattr_t  *attr, 

											int *pshared);

pthread_rwlockattr_getpshared()attr 引用的已初始化属性对象中获取由进程共享的属性的值。

pthread_rwlockattr_getpshared 返回值

如果成功,pthread_rwlockattr_getpshared() 会返回零。否则,将返回用于指明错误的错误号。


EINVAL

描述:

attrpshared 指定的值无效。