使用读写锁 (多线程编程指南)

配置读写锁的属性以后,便可初始化读写锁。如下函数用于初始化或销毁读写锁、锁定或解除锁定读写锁或尝试锁定读写锁。下表列出了本节中讨论的用来处理读写锁的函数。并发

表 4–9 处理读写锁的例程 
读取非阻塞读写锁中的锁函数

写入非阻塞读写锁中的锁spa

初始化读写锁线程

使用 能够经过 attr 所引用的属性初始化 rwlock 所引用的读写锁。code

include int pthread_rwlock_init(pthread_rwlock_t
rwlock, const pthread_rwlockattr_t 
attr); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

若是 attr 为 NULL,则使用缺省的读写锁属性,其做用与传递缺省读写锁属性对象的地址相同。初始化读写锁以后,该锁可使用任意次数,而无需从新初始化。成功初始化以后,读写锁的状态会变为已初始化和未锁定。若是调用 pthread_rwlock_init() 来指定已初始化的读写锁,则结果是不肯定的。若是读写锁在使用以前未初始化,则结果是不肯定的。对于 Solaris 线程,请参见。orm

若是缺省的读写锁属性适用,则 PTHREAD_RWLOCK_INITIALIZER 宏可初始化以静态方式分配的读写锁,其做用与经过调用 pthread_rwlock_init() 并将参数 attr 指定为 NULL 进行动态初始化等效,区别在于不会执行错误检查。对象

若是成功,pthread_rwlock_init() 会返回零。不然,将返回用于指明错误的错误号。ci

若是 pthread_rwlock_init() 失败,将不会初始化 rwlock,而且 rwlock 的内容是不肯定的。资源

描述:it

attr 或 rwlock 指定的值无效。

获取读写锁中的读锁

可用来向 rwlock 所引用的读写锁应用读锁。

include int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock );

如 果写入器未持有读锁,而且没有任何写入器基于该锁阻塞,则调用线程会获取读锁。若是写入器未持有读锁,但有多个写入器正在等待该锁时,调用线程是否能获取 该锁是不肯定的。若是某个写入器持有读锁,则调用线程没法获取该锁。若是调用线程未获取读锁,则它将阻塞。调用线程必须获取该锁以后,才能从 pthread_rwlock_rdlock() 返回。若是在进行调用时,调用线程持有 rwlock 中的写锁,则结果是不肯定的。

为避免写入器资源匮乏,容许在多个实现中使写入器的优先级高于读取器。例如,Solaris 线程实现中写入器的优先级高于读取器。 请参见。

一个线程能够在 rwlock 中持有多个并发的读锁,该线程能够成功调用 pthread_rwlock_rdlock() n 次。该线程必须调用 pthread_rwlock_unlock() n 次才能执行匹配的解除锁定操做。

若是针对未初始化的读写锁调用 pthread_rwlock_rdlock(),则结果是不肯定的。

线程信号处理程序能够处理传送给等待读写锁的线程的信号。从信号处理程序返回后,线程将继续等待读写锁以执行读取,就好像线程未中断同样。

若是成功,pthread_rwlock_rdlock() 会返回零。不然,将返回用于指明错误的错误号。

描述:

attr 或 rwlock 指定的值无效。

读取非阻塞读写锁中的锁

应用读锁的方式与 pthread_rwlock_rdlock() 相似,区别在于若是任何线程持有 rwlock 中的写锁或者写入器基于 rwlock 阻塞,则 pthread_rwlock_tryrdlock() 函数会失败。对于 Solaris 线程,请参见。

include int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

若是获取了用于在 rwlock 所引用的读写锁对象中执行读取的锁,则 pthread_rwlock_tryrdlock() 将返回零。若是没有获取该锁,则返回用于指明错误的错误号。

描述:

没法获取读写锁以执行读取,由于写入器持有该锁或者基于该锁已阻塞。

写入读写锁中的锁

可用来向 rwlock 所引用的读写锁应用写锁。

include int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock );

若是没有其余读取器线程或写入器线程持有读写锁 rwlock,则调用线程将获取写锁。不然,调用线程将阻塞。调用线程必须获取该锁以后,才能从 pthread_rwlock_wrlock() 调用返回。若是在进行调用时,调用线程持有读写锁(读锁或写锁),则结果是不肯定的。

为避免写入器资源匮乏,容许在多个实现中使写入器的优先级高于读取器。(例如,Solaris 线程实现容许写入器的优先级高于读取器。请参见。)

若是针对未初始化的读写锁调用 pthread_rwlock_wrlock(),则结果是不肯定的。

线程信号处理程序能够处理传送给等待读写锁以执行写入的线程的信号。从信号处理程序返回后,线程将继续等待读写锁以执行写入,就好像线程未中断同样。

若是获取了用于在 rwlock 所引用的读写锁对象中执行写入的锁,则 pthread_rwlock_rwlock() 将返回零。若是没有获取该锁,则返回用于指明错误的错误号。

写入非阻塞读写锁中的锁

应用写锁的方式与 pthread_rwlock_wrlock() 相似,区别在于若是任何线程当前持有用于读取和写入的 rwlock,则 pthread_rwlock_trywrlock() 函数会失败。对于 Solaris 线程,请参见 。

include int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

若是针对未初始化的读写锁调用 pthread_rwlock_trywrlock(),则结果是不肯定的。

线程信号处理程序能够处理传送给等待读写锁以执行写入的线程的信号。从信号处理程序返回后,线程将继续等待读写锁以执行写入,就好像线程未中断同样。

若是获取了用于在 rwlock 引用的读写锁对象中执行写入的锁,则 pthread_rwlock_trywrlock() 将返回零。不然,将返回用于指明错误的错误号。

描述:

没法为写入获取读写锁,由于已为读取或写入锁定该读写锁。

解除锁定读写锁

可用来释放在 rwlock 引用的读写锁对象中持有的锁。

include int pthread_rwlock_unlock (pthread_rwlock_t *rwlock);

若是调用线程未持有读写锁 rwlock,则结果是不肯定的。对于 Solaris 线程,请参见。

若是经过调用 pthread_rwlock_unlock() 来释放读写锁对象中的读锁,而且其余读锁当前由该锁对象持有,则该对象会保持读取锁定状态。若是 pthread_rwlock_unlock() 释放了调用线程在该读写锁对象中的最后一个读锁,则调用线程再也不是该对象的属主。若是 pthread_rwlock_unlock() 释放了该读写锁对象的最后一个读锁,则该读写锁对象将处于无属主、解除锁定状态。

若是经过调用 pthread_rwlock_unlock() 释放了该读写锁对象的最后一个写锁,则该读写锁对象将处于无属主、解除锁定状态。

若是 pthread_rwlock_unlock() 解除锁定该读写锁对象,而且多个线程正在等待获取该对象以执行写入,则经过调度策略可肯定获取该对象以执行写入的线程。若是多个线程正在等待获取读写锁对象以执行读取,则经过调度策略可肯定等待线程获取该对象以执行写入的顺序。若是多个线程基于 rwlock 中的读锁和写锁阻塞,则没法肯定读取器和写入器谁先得到该锁。

若是针对未初始化的读写锁调用 pthread_rwlock_unlock(),则结果是不肯定的。

若是成功,pthread_rwlock_unlock() 会返回零。不然,将返回用于指明错误的错误号。

销毁读写锁

可用来销毁 rwlock 引用的读写锁对象并释放该锁使用的任何资源。

include int pthread_rwlock_destroy(pthread_rwlock_t *rwlock); pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;

在再次调用 pthread_rwlock_init() 从新初始化该锁以前,使用该锁所产生的影响是不肯定的。实现可能会致使 pthread_rwlock_destroy() 将 rwlock 所引用的对象设置为无效值。若是在任意线程持有 rwlock 时调用 pthread_rwlock_destroy(),则结果是不肯定的。尝试销毁未初始化的读写锁会产生不肯定的行为。已销毁的读写锁对象可使用 pthread_rwlock_init() 来从新初始化。销毁读写锁对象以后,若是以其余方式引用该对象,则结果是不肯定的。对于 Solaris 线程,请参见。

若是成功,pthread_rwlock_destroy() 会返回零。不然,将返回用于指明错误的错误号。

描述:

attr 或 rwlock 指定的值无效。

相关文章
相关标签/搜索