使用读写锁
配置读写锁的属性之后,即可初始化读写锁。以下函数用于初始化或销毁读写锁、锁定或解除锁定读写锁或尝试锁定读写锁。下表列出了本节中讨论的用来处理读写锁的函数。
表 4–9 处理读写锁的例程 读取非阻塞读写锁中的锁
写入非阻塞读写锁中的锁
初始化读写锁
使用 可以通过 attr 所引用的属性初始化 rwlock 所引用的读写锁。
#include <pthread.h> 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 线程,请参见。
如果缺省的读写锁属性适用,则 PTHREAD_RWLOCK_INITIALIZER 宏可初始化以静态方式分配的读写锁,其作用与通过调用 pthread_rwlock_init() 并将参数 attr 指定为 NULL 进行动态初始化等效,区别在于不会执行错误检查。
如果成功,pthread_rwlock_init() 会返回零。否则,将返回用于指明错误的错误号。
如果 pthread_rwlock_init() 失败,将不会初始化 rwlock,并且 rwlock 的内容是不确定的。
描述:
attr 或 rwlock 指定的值无效。
获取读写锁中的读锁
可用来向 rwlock 所引用的读写锁应用读锁。
#include <pthread.h> 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 <pthread.h> int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);
如果获取了用于在 rwlock 所引用的读写锁对象中执行读取的锁,则 pthread_rwlock_tryrdlock() 将返回零。如果没有获取该锁,则返回用于指明错误的错误号。
描述:
无法获取读写锁以执行读取,因为写入器持有该锁或者基于该锁已阻塞。
写入读写锁中的锁
可用来向 rwlock 所引用的读写锁应用写锁。
#include <pthread.h> 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 <pthread.h> int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);
如果针对未初始化的读写锁调用 pthread_rwlock_trywrlock(),则结果是不确定的。
线程信号处理程序可以处理传送给等待读写锁以执行写入的线程的信号。从信号处理程序返回后,线程将继续等待读写锁以执行写入,就好像线程未中断一样。
如果获取了用于在 rwlock 引用的读写锁对象中执行写入的锁,则 pthread_rwlock_trywrlock() 将返回零。否则,将返回用于指明错误的错误号。
描述:
无法为写入获取读写锁,因为已为读取或写入锁定该读写锁。
解除锁定读写锁
可用来释放在 rwlock 引用的读写锁对象中持有的锁。
#include <pthread.h> 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 <pthread.h> 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 指定的值无效。
分享到:
相关推荐
### 多线程编程指南 #### 简介与文档结构 本指南旨在为iOS开发者提供一个多线程编程的全面介绍。多线程是现代操作系统中的一个重要特性,它允许应用程序同时执行多个任务,从而提高效率并充分利用计算资源。在iOS...
在学习《多线程编程指南--C版》的过程中,你可以通过书中提供的Linux下实现的机制,如使用`pthreads`库,深入理解多线程编程的实际应用,掌握如何在C语言环境中构建高效、可靠的多线程程序。通过实践这些示例,你将...
《多线程编程指南》是一本深入探讨多线程编程技术的专业书籍,旨在帮助开发者理解和掌握如何在并发环境中高效地利用计算资源。PDF版本的提供使得读者可以随时随地查阅和学习,不受物理媒介限制。 在多线程编程领域...
《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为核心篇和设计模式篇,旨在帮助开发者掌握并应用多线程技术。 1. **线程基础** - **线程的创建**:Java提供了两种创建线程...
本指南将深入探讨多线程编程的基础、实践与优化策略。 一、多线程基础 1. 线程的概念:线程是操作系统分配CPU时间的基本单位,一个进程可以包含多个线程,它们共享进程的内存空间,但拥有独立的执行路径。 2. C++11...
POSIX线程编程指南,通常被称为Pthreads,是操作系统接口的一部分,用于支持多线程编程。这个合集可能包含了深入的教程和实例,帮助开发者理解和掌握如何在遵循POSIX标准的系统上创建和管理线程。以下是关于POSIX...
iOS开发多线程编程指南是Apple官方提供的一个多线程编程的详细教程,涵盖了在iOS平台上进行多线程编程的基本概念、设计技巧、线程管理和同步工具等方面的全面知识。对于希望在iOS平台上开发高性能应用的开发者来说,...
从给出的文件《多线程编程指南.pdf》来看,我们可以抽取出一系列关于多线程编程的知识点。 首先,多线程编程的基本概念和定义是关键。多线程是指一个进程内部可以同时执行两个或两个以上的线程,每个线程可以被看作...
总体来说,Linux多线程编程手册是一个关于在Linux环境下使用多线程API进行编程的全面指南。对于希望构建高性能、高响应速度应用程序的开发者来说,这是一份宝贵的资源。手册中不仅详细介绍了多线程编程的理论知识,...
### Unix/Linux多线程编程指南知识点总结 #### 一、多线程编程基础 - **多线程概念:** 在Unix/Linux系统下,多线程编程是指在一个进程中创建多个线程来并行执行任务的方式。这有助于提高程序的效率和响应能力。 - ...
**基于POSIX多线程编程指南** 在计算机编程中,多线程是一种允许程序同时执行多个任务的技术。POSIX(可移植操作系统接口)是为操作系统定义的一组标准接口,其中包括了对多线程的支持。本指南将深入探讨如何在遵循...
本压缩包包含了两本关于多线程编程的经典教材——"多线程编程指南(中文版)"和"pthread primer(英文)",它们将深入探讨这一主题。 "多线程编程指南(中文版)"是为初学者和有一定经验的开发者设计的,旨在帮助...