第 10 章 RHEL for Real Time 中的线程同步机制
实时,当两个或多个线程同时访问共享资源时,线程会协调使用线程同步机制。线程同步可确保一次只有一个线程使用共享资源。Linux 中使用的三个线程同步机制: Mutexes、Barriers 和 Condition 变量(condvars
)。
10.1. mutexes
Mutex 从相互排除的术语中派生出来。mutual exclude 对象同步对资源的访问。它是保证一个线程一次只能获取 mutex 的机制。
mutex
算法会创建一个对代码的每个部分的串行访问,以便在任何时候都执行代码。mutex
使用称为 mutex 属性对象的属性对象创建。这是一个抽象对象,其中包含多个取决于您选择实现的 POSIX 选项的属性。属性对象通过 pthread_mutex_t
变量定义。对象存储为 mutex 定义的属性。pthread_mutex_init (&my_mutex, &my_mutex_attr)
, pthread_mutexattr_setrobust ()
和 pthread_mutexattr_getrobust ()
函数返回 0。出错时,它们会返回错误号。
在实时中,您可以保留属性对象来初始化同一类型的更多静默,或者您可以清理(销毁)属性对象。mutex 在这两种情况下都不会受到影响。mutexes 包括标准和高级 mutexes。
Standard mutexes
实时标准 mutexes 是私有、非递归、非忙碌和非优先级继承能力。使用 pthread_mutex_ init (&my_mutex, &my_mutex_attr)初始化
创建一个标准的 mutex。使用标准 mutex 类型时,您的应用程序可能无法从 pthread_mutex_
tpthreads
API 和 RHEL for Real Time 内核提供的优点中受益。
Advanced mutexes
带有额外功能的 mutexes 称为高级 mutexes。高级功能包括 mutex 的优先级继承、可靠的行为,以及共享和私有 mutexes。例如,对于强大的 mutexes,初始化 pthread_mutexattr_setrobust ()
函数,设置 robust 属性。同样,通过使用属性 PTHREAD_PROCESS_SHARED
,允许任何线程在 mutex 上运行,只要线程有权访问其分配的内存。属性 PTHREAD_PROCESS_PRIVATE
设置私有 mutex。
非滥用 mutex 不会自动发布并保持锁定,直到手动释放为止。