在两个任务之间使用互斥信号量

时间:2018-03-28 18:56:48

标签: c++ c semaphore vxworks

我试图了解一般如何使用信号量。为了维护任务优先级,我选择了互斥锁型信号量而不是二进制。概要是:

我有两个任务,WebTask和DBTask。

WebTask是一个简单的任务,它可以(可以猜测)Web请求并对它们执行某些操作。

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

以下是需要解决的问题

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

    1. 收到消息
    2. 与数据库交谈
    3. 格式化结果
  4. 没有信号量,这里发生了什么

    1. WebTask构造并发送msg
    2. WebTask继续
    3. DBTask获取msg
    4. DBTask与数据库对话,获取数据等
    5. 显然他们不同步(应该是1,3,4,2)

      这只是我试过的一件事,我觉得它会起作用..

      1. WebTask创建新的互斥信号量
      2. WebTask构造并发送一个msg,同时还告诉DBTask有关信号量ID
      3. WebTask获取信号量
      4. DBTask获取msg
      5. DBTask处理msg
      6. DBTasks发回信号量
      7. 这没有改变。

        我根本不了解(经过多次尝试)。

        1. 谁应该负责信号量?谁应该创造它?
        2. 信号量何时被采集?
        3. 信号量何时给出?
        4. (注意:我在VxWorks上)

2 个答案:

答案 0 :(得分:0)

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

Web任务在启动时创建信号量。 Web任务获取数据,将其加载到某个请求/响应对象实例中,以及其信号量引用/指针。它将它发送到队列并等待信号量。 DB任务获取对象,读取请求,处理它,加载带有结果的响应字段(或错误消息:),并发信号通知信号量。然后,Web任务将继续运行,并且知道响应可用。

这样,几个Web任务就可以使用DB及其输入队列。

忘记互斥的东西,你不需要任何互斥,(好吧,可能有一个保护数据库输入生产者 - 消费者队列,但可能是内部问题)。

答案 1 :(得分:0)

在WebTask中,在将msg发送到DBTask之后,它在DBTask中等待semephore(semTake),在处理数据库请求和数据格式化之后,它释放一个semephore(semGive)。我认为这应该使你的2个任务同步。