【发布时间】:2018-03-28 18:56:47
【问题描述】:
我想了解一般情况下如何使用信号量。为了保持任务优先级,我选择了互斥类型信号量而不是二进制信号量。概要是:
我有两个任务,WebTask 和 DBTask。
WebTask 是一个简单的任务,它接受(你能猜到)网络请求并对其进行处理。
DBTask 是一个(你知道的)数据库任务,它在消息队列类型系统上运行,所以为了使用它,你必须向它的队列发送带有 n 个参数的消息。
事情是这样发展下去的
- WebTask 接收输入并希望从 DBTask 获取数据。
- WebTask 为 DBTask 构造一条消息,并将其与 DBTask 的 id 和所有参数一起发送到主消息系统
-
WebTask 必须等待 DBTask 来
- 接收消息
- 与数据库对话
- 格式化结果
没有信号量,这就是正在发生的事情
- WebTask 构造并发送消息
- WebTask 继续
- DBTask 获取消息
- DBTask 与数据库对话、获取数据等
所以很明显它们不同步(应该是 1,3,4,2)
这只是我尝试过的一件我认为可行的事情..
- WebTask 创建一个新的互斥信号量
- WebTask 构造并发送一个 msg,同时还告诉 DBTask 信号量 ID
- WebTask 采用信号量
- DBTask 获取消息
- DBTask 进程消息
- DBTasks 回馈信号量
这并没有改变。
我完全不明白(经过多次尝试)。
- 谁应该负责信号量?谁应该创建它?
- 何时获取信号量?
- 什么时候给出信号量?
(注意:我在 VxWorks)
【问题讨论】:
-
互斥锁不是信号量。但是,可以使用互斥锁和条件变量来实现信号量。
-
@JiveDadson Mutex 信号量是 VxWorks OS 提供的 3 或 4 种信号量类型之一。它们旨在提供围绕共享资源的互斥,二进制信号量更适合用于同步。