gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:06:18 25 4
gpt4 key购买 nike

我试图了解一般如何使用信号量。为了保持任务优先级,我选择了互斥类型信号量而不是二进制信号量。内容简介为:

我有两个任务,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 构造并发送消息,同时告知 DBTask 信号量 ID
  3. WebTask 获取信号量
  4. DBTask 获取消息
  5. DBTask 处理消息
  6. DBTasks 返回信号量

这没有改变任何事情。

我根本不明白(经过多次尝试)。

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

(注:我使用的是VxWorks)

最佳答案

如果您必须以这种同步方式完成任务,那很简单。

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

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

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

关于c++ - 在两个任务之间使用互斥信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com