【问题标题】:Using a mutex semaphore between two tasks在两个任务之间使用互斥信号量
【发布时间】:2018-03-28 18:56:47
【问题描述】:

我想了解一般情况下如何使用信号量。为了保持任务优先级,我选择了互斥类型信号量而不是二进制信号量。概要是:

我有两个任务,WebTask 和 DBTask。

WebTask 是一个简单的任务,它接受(你能猜到)网络请求并对其进行处理。

DBTask 是一个(你知道的)数据库任务,它在消息队列类型系统上运行,所以为了使用它,你必须向它的队列发送带有 n 个参数的消息。

事情是这样发展下去的

  1. WebTask 接收输入并希望从 DBTask 获取数据。
  2. WebTask 为 DBTask 构造一条消息,并将其与 DBTask 的 id 和所有参数一起发送到主消息系统
  3. WebTask 必须等待 DBTask 来

    1. 接收消息
    2. 与数据库对话
    3. 格式化结果

没有信号量,这就是正在发生的事情

  1. WebTask 构造并发送消息
  2. WebTask 继续
  3. DBTask 获取消息
  4. DBTask 与数据库对话、获取数据等

所以很明显它们不同步(应该是 1,3,4,2)

这只是我尝试过的一件我认为可行的事情..

  1. WebTask 创建一个新的互斥信号量
  2. WebTask 构造并发送一个 msg,同时还告诉 DBTask 信号量 ID
  3. WebTask 采用信号量
  4. DBTask 获取消息
  5. DBTask 进程消息
  6. DBTasks 回馈信号量

这并没有改变。

我完全不明白(经过多次尝试)。

  1. 谁应该负责信号量?谁应该创建它?
  2. 何时获取信号量?
  3. 什么时候给出信号量?

(注意:我在 VxWorks)

【问题讨论】:

  • 阅读这个:How to Ask,这个:minimal reproducible example
  • 互斥锁不是信号量。但是,可以使用互斥锁和条件变量来实现信号量。
  • @JiveDadson Mutex 信号量是 VxWorks OS 提供的 3 或 4 种信号量类型之一。它们旨在提供围绕共享资源的互斥,二进制信号量更适合用于同步。

标签: c++ c semaphore vxworks


【解决方案1】:

如果您必须以这种同步方式完成任务,那就很容易了。

网络任务在启动时创建一个信号量。 Web 任务获取数据,将其连同其信号量引用/指针一起加载到一些请求/响应对象实例中。它将它触发到队列并等待信号量。 DB 任务获取对象,读取请求,对其进行处理,将结果(或错误消息:)加载到响应字段中,并发出信号量信号。然后 Web 任务继续运行,知道响应可用。

这样,多个网络任务可以使用数据库及其输入队列。

忘记互斥锁的东西,你不需要任何互斥锁,(嗯,很可能有一个保护 DB 输入生产者-消费者队列,但大概是内部事务)。

【讨论】:

    【解决方案2】:

    在WebTask中,将msg发送给DBTask后,它会等待一个信号量(semTake),而在DBTask中,在处理完数据库请求和数据格式化后,它会释放一个信号量(semGive)。我认为这应该使您的 2 个任务同步。

    【讨论】:

      猜你喜欢
      • 2016-08-30
      • 2017-08-24
      • 2011-04-20
      • 2012-09-01
      • 2017-11-19
      • 2010-09-08
      • 2021-11-18
      • 2011-10-11
      • 2011-01-05
      相关资源
      最近更新 更多