B_QuRT_User_Guide(11)
7 Priority Inheritance Mutexes
QuRT支持递归互斥的一个变种,即优先继承互斥。
优先级继承互斥在功能上等同于递归互斥(第6节),只是它们使线程在锁定互斥后可以执行优先级继承。
- 如果一个线程锁定了一个优先级继承互斥,而另一个具有更高优先级的线程(第3节)在该互斥上被暂停,拥有锁的线程就会获得被暂停线程的更高优先级。
- 如果多个线程在一个优先级继承互斥上被暂停,拥有锁的线程将获得被暂停的最高优先级的线程的优先级(如果它比线程的原始优先级高。
优先级的变化是暂时的–当一个线程解锁一个优先级继承的突变体时,它的线程优先级会恢复到原来的值。
除了在函数名称中从mutex改为pimutex外,普通的和优先级继承的mutex操作是相同的。
注意:对于优先级继承的mutex,尝试锁操作处理嵌套锁,就像mutex被解锁一样。
优先继承的mutex是共享对象,支持以下操作: - qurt_pimutex_init()
- qurt_pimutex_destroy()
- qurt_pimutex_lock
- qurt_pimutex_try_lock() - qurt_pimutex_unlock()
7.1 qurt_pimutex_init()
7.1.1 Function Documentation
7.1.1.1 void qurt_pimutex_init ( qurt_mutex_t ∗ lock )
初始化一个优先级继承的mutex对象。优先级继承的mutex最初是被解锁的。
这个函数的作用与qurt_mutex_init()相同。
注意:每个基于pimutex的对象都有一个或多个与之相关的内核资源;为了防止资源泄漏,当这个对象不再被使用时,请调用qurt_pimutex_destroy()。
相关数据类型
qurt_mutex_t
参数
返回值
None.
依赖关系
None.
7.2 qurt_pimutex_destroy()
7.2.1 Function Documentation
7.2.1.1 void qurt_pimutex_destroy ( qurt_mutex_t ∗ lock )
销毁指定的优先级继承的突变体。
注意:当优先级继承突变体不再被使用时,必须将其销毁。如果不这样做,会导致QuRT内核的资源泄漏。
优先级继承的突变体不能在仍在使用时被销毁。如果发生这种情况,QuRT的行为将无法定义。
相关数据类型
qurt_mutex_t
参数
返回值
None.
依赖关系
None.
7.3 qurt_pimutex_lock
7.3.1 Function Documentation
7.3.1.1 void qurt_pimutex_lock ( qurt_mutex_t ∗ lock )
请求访问一个共享资源。如果一个线程对一个没有被使用的突变体执行了锁操作。
该线程将获得对该突变体所保护的共享资源的访问权,并继续执行。
如果一个线程对一个已经被另一个线程使用的突变体执行锁操作,该线程将被暂停。当该突变体再次变得可用时(因为其他线程已经解锁),该线程会被唤醒并获得对共享资源的访问。
如果一个线程在优先级继承的mutex上被暂停,而被暂停的线程的优先级高于锁定mutex的线程的优先级,那么拥有mutex的线程就会获得被暂停线程的更高优先级。锁定的线程会阻塞,直到锁可用为止。
注意。
如果一个线程锁定了它自己已经锁定的优先级继承的mutex,那么它就不会被暂停。然而,在该线程对该突变体执行平衡数量的解锁之前,该突变体不会对其他线程可用。
当多个线程争夺一个突变体时,优先继承突变体的锁操作比递归突变体的锁操作要慢。特别是,当突变体可用于锁定时,它的速度要慢10倍左右,而当突变体已经被锁定时,它的速度会更慢(时间上有很大差异)。
相关数据类型
qurt_mutex_t
参数
返回值
None.
依赖关系
None.
7.4 qurt_pimutex_try_lock()
7.4.1 Function Documentation
7.4.1.1 int qurt_pimutex_try_lock ( qurt_mutex_t ∗ lock )
请求访问一个共享资源(没有暂停)。试图锁定指定的优先级继承的
mutex。
如果一个线程在一个未被使用的优先级继承突变上执行try_lock操作,该线程将获得对受该突变保护的共享资源的访问,并继续执行。如果一个线程在一个已经被其他线程使用的优先级继承突变上执行try_lock操作,qurt_pimutex_try_lock立即返回一个非零的结果值。
相关数据类型
qurt_mutex_t
参数
返回值
0 – Success. Nonzero – Failure.
依赖关系
None.
7.5 qurt_pimutex_unlock()
7.5.1 Function Documentation
7.5.1.1 void qurt_pimutex_unlock ( qurt_mutex_t ∗ lock )
释放对共享资源的访问;解锁指定的优先级继承互斥。
在一个优先级继承的mutex上可以有多个线程被暂停。当mutex被解锁时,只有在mutex上等待的最高优先级的线程被唤醒。如果被唤醒的线程比当前线程的优先级高,就会发生上下文切换。
当一个线程解锁一个优先级继承的突变体时,它的线程优先级被恢复到它的原始值,即从另一个暂停在该突变体上的线程获得的任何更高的优先级值。
相关数据类型
qurt_mutex_t
参数
返回值
None.
依赖关系
None.