当前位置:网站首页>B_QuRT_User_Guide(20)
B_QuRT_User_Guide(20)
2022-06-11 02:38:00 【weixin_38498942】
B_QuRT_User_Guide(20)
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 )
通知多个等待线程指定条件为真。
当线程希望在共享数据项上广播条件为真时,它必须执行以下过程:
- 锁定控制对数据项访问的互斥锁。
- 执行广播条件操作。
- 解锁互斥锁。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。
相关数据类型
qurt_cond_t
参数
| in | cond | 指向要发出信号的条件变量对象的指针。 |
返回值
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
参数
| in | cond | 指向要销毁的条件变量对象的指针。 |
返回值
None.
13.3 qurt_cond_init()
13.3.1 功能文档
13.3.1.1 void qurt_cond_init ( qurt_cond_t ∗ cond )
初始化一个条件变量对象。
相关数据类型
qurt_cond_t
参数
| out | cond | 指向已初始化条件变量对象的指针。 |
返回值
None.
依赖关系
None.
13.4 qurt_cond_signal()
13.4.1 功能文档
13.4.1.1 void qurt_cond_signal ( qurt_cond_t ∗ cond )
通知等待线程指定条件为真。
当线程希望在共享数据项上发出条件为真信号时,它必须执行以下过程:
- 锁定控制对数据项访问的互斥锁。
- 执行信号条件操作。
- 解锁互斥锁。
注意:未能正确锁定和解锁条件变量的互斥锁可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。
相关数据类型
qurt_cond_t
参数
| in | cond | 指向要发出信号的条件变量对象的指针。 |
返回值
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 )
挂起当前线程,直到指定条件为真。 当线程希望等待共享数据项的特定条件时,它必须执行以下过程:
- 锁定控制对数据项访问的互斥锁。
- 如果条件不满足,对条件变量进行等待条件操作(挂起线程,解锁互斥锁)。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。
相关数据类型
qurt_cond_t
qurt_mutex_t
参数
| in | cond | 指向要等待的条件变量对象的指针。 |
| in | mutex | 指向与要等待的条件变量关联的互斥锁的指针。 |
返回值
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 )
挂起当前线程,直到指定条件为真。 当线程希望等待共享数据项的特定条件时,它必须执行以下过程:
- 锁定控制对数据项访问的互斥锁。
- 如果条件不满足,对条件变量进行等待条件操作(挂起线程,解锁互斥锁)。
注意:未能正确锁定和解锁条件变量的互斥体可能会导致线程永远不会挂起(或暂停但从未唤醒)。
仅将条件变量与常规互斥锁一起使用——尝试使用递归互斥锁或优先级继承互斥锁会导致未定义的行为。
这是与 qurt_cond_wait() 相同的 API,在使用 qurt_rmutex2_t 类型的互斥锁时使用此版本。
相关数据类型
qurt_cond_t
qurt_rmutex2_t
参数
| in | cond | 指向要等待的条件变量对象的指针。 |
| in | mutex | 指向与要等待的条件变量关联的互斥锁的指针。 |
返回值
None.
依赖关系
None.
13.7 数据类型
本节介绍条件变量服务的数据类型。
- 条件变量在QuRT 中表示为qurt_cond_t 类型的对象。
13.7.1 数据结构文档
13.7.1.1 union qurt_cond_t
QuRT 条件变量类型。
边栏推荐
- ROS基础 - 使用 launch 文件(一) - 批量启动多个ROS节点
- Longest increasing subsequence
- The two request sessionids of the same user are inconsistent ----- record the problem
- Go 语言的优势和学习路线图
- CPT 102_ LEC 18
- Databinding escaping with presentation symbols
- OpenJudge NOI 1.13 18:Tomorrow never knows?
- Young people fleeing big cities: shouldering housing prices and pressure, but not epidemics
- AOSP ~ WIFI默认开启 + GPS默认关闭 + 蓝牙默认关闭 + 旋转屏幕关闭
- 蓝桥杯_小蓝吃糖果_鸽巢原理 / 抽屉原理
猜你喜欢

CocosCreator原生二次开发的正确姿势

Baidu submits sitemap to prompt the solution of "index type is not handled"

Google Gmail mailbox marks all unread messages as read at once

CPT 102_LEC 15

Link list of high frequency written interview question brushing summary (distribution explanation & code annotation)

How to add two factor authentication for WordPress websites

JS memory leak

怎样简洁明了地说清楚产品需求?

Android P SoftAP start process

Manon's advanced road - Daily anecdotes
随机推荐
How to add two factor authentication for WordPress websites
Wechat applet
. Net module and assembly - NET Module vs Assembly
反射三种方式
What is ttfb
OpenJudge NOI 1.13 18:Tomorrow never knows?
Question bank and answers for 2022 melting welding and thermal cutting operation certificate examination
net core天马行空系列-可用于依赖注入的,数据库表和c#实体类互相转换的接口实现
Construction of Flink development environment and wordcount
AOSP ~ logcat chatty line expired
Forest v1.5.22 release! Kotlin support
数据库唯一索引和普通索引的区别?
How can Delma's own brand "take off" when Philips is listed on the market?
[resolved] how to fix another update in progress WordPress upgrade error
Android WiFi hide SSID configuration method
Graphacademy course explanation: Fundamentals of neo4j graph data science
CPT 102_LEC 13-14
[long time series prediction] aotoformer code detailed [3] model overall architecture analysis
[Fibonacci series]
Go 语言的优势和学习路线图