当前位置:网站首页>B_QuRT_User_Guide(20)

B_QuRT_User_Guide(20)

2022-06-11 02:38:00 weixin_38498942

13 条件变量

线程使用条件变量根据共享数据项中的值同步它们的执行。条件变量在线程通常必须连续轮询数据项直到它包含特定值的情况下很有用——使用条件变量线程可以无需轮询即可完成相同的任务。

条件变量始终与关联的互斥锁(第 5 节)一起使用,以确保在没有线程争用的情况下检查和更新共享数据项。

对于等待共享数据项的特定条件的线程,它必须首先锁定控制对数据项的访问的互斥锁。 如果条件不满足,则线程对条件变量执行等待条件操作(挂起线程并解锁互斥锁)。

对于一个线程要在共享数据项上发出一个条件为真的信号,它必须首先锁定控制对数据项的访问的互斥锁,然后执行信号条件操作,最后显式解锁互斥锁。

信号条件操作用于唤醒单个等待线程。 如果多个线程都在等待一个条件变量,它们都可以通过广播条件操作被唤醒。

注意:未能使用条件变量正确锁定和解锁互斥锁可能导致线程永远不会挂起(或暂停但从未唤醒)。    

因为 QuRT 允许线程被虚假条件唤醒,所以线程应始终在被唤醒时验证目标条件。

条件变量是支持以下操作的共享对象:

  • qurt_cond_broadcast()
  • qurt_cond_destroy()
  • qurt_cond_init()
  • qurt_cond_signal()
  • qurt_cond_wait()
  • qurt_cond_wait2()
  • Data Types

13.1 qurt_cond_broadcast()

13.1.1 功能文档

13.1.1.1 void qurt_cond_broadcast ( qurt_cond_t ∗ cond )

通知多个等待线程指定条件为真。
当线程希望在共享数据项上广播条件为真时,它必须执行以下过程:

  1. 锁定控制对数据项访问的互斥锁。
  2. 执行广播条件操作。
  3. 解锁互斥锁。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。

相关数据类型
qurt_cond_t

参数

incond指向要发出信号的条件变量对象的指针。

返回值
None.

依赖关系
None.

13.2 qurt_cond_destroy()

13.2.1 功能文档

13.2.1.1 void qurt_cond_destroy ( qurt_cond_t ∗ cond )

销毁指定的条件变量。

注意:条件不再使用时必须销毁。  不这样做会导致 QuRT 内核中的资源泄漏。
不得破坏仍在使用的条件。  如果发生这种情况,则 QuRT 的行为是未定义的。

相关数据类型
qurt_cond_t

参数

incond指向要销毁的条件变量对象的指针。

返回值
None.

13.3 qurt_cond_init()

13.3.1 功能文档

13.3.1.1 void qurt_cond_init ( qurt_cond_t ∗ cond )

初始化一个条件变量对象。

相关数据类型
qurt_cond_t

参数

outcond指向已初始化条件变量对象的指针。

返回值
None.

依赖关系
None.

13.4 qurt_cond_signal()

13.4.1 功能文档

13.4.1.1 void qurt_cond_signal ( qurt_cond_t ∗ cond )

通知等待线程指定条件为真。
当线程希望在共享数据项上发出条件为真信号时,它必须执行以下过程:

  1. 锁定控制对数据项访问的互斥锁。
  2. 执行信号条件操作。
  3. 解锁互斥锁。
注意:未能正确锁定和解锁条件变量的互斥锁可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。

相关数据类型
qurt_cond_t

参数

incond指向要发出信号的条件变量对象的指针。

返回值
None.

依赖关系
None.

13.5 qurt_cond_wait()

13.5.1 功能文档

13.5.1.1 void qurt_cond_wait ( qurt_cond_t ∗ cond, qurt_mutex_t ∗ mutex )

挂起当前线程,直到指定条件为真。 当线程希望等待共享数据项的特定条件时,它必须执行以下过程:

  1. 锁定控制对数据项访问的互斥锁。
  2. 如果条件不满足,对条件变量进行等待条件操作(挂起线程,解锁互斥锁)。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。    
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。

相关数据类型
qurt_cond_t
qurt_mutex_t

参数

incond指向要等待的条件变量对象的指针。
inmutex指向与要等待的条件变量关联的互斥锁的指针。

返回值
None.

依赖关系
None.

13.6 qurt_cond_wait2()

13.6.1 功能文档

13.6.1.1 void qurt_cond_wait2 ( qurt_cond_t ∗ cond, qurt_rmutex2_t ∗ mutex )

挂起当前线程,直到指定条件为真。 当线程希望等待共享数据项的特定条件时,它必须执行以下过程:

  1. 锁定控制对数据项访问的互斥锁。
  2. 如果条件不满足,对条件变量进行等待条件操作(挂起线程,解锁互斥锁)。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。
这是与 qurt_cond_wait() 相同的 API,在使用 qurt_rmutex2_t 类型的互斥锁时使用此版本。

相关数据类型
qurt_cond_t
qurt_rmutex2_t

参数

incond指向要等待的条件变量对象的指针。
inmutex指向与要等待的条件变量关联的互斥锁的指针。

返回值
None.

依赖关系
None.

13.7 数据类型

本节介绍条件变量服务的数据类型。

  • 条件变量在QuRT 中表示为qurt_cond_t 类型的对象。

13.7.1 数据结构文档

13.7.1.1 union qurt_cond_t

QuRT 条件变量类型。

原网站

版权声明
本文为[weixin_38498942]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_38498942/article/details/125200244