【问题标题】:Is std::queue having event mechanism( Signals in std::queue)std::queue 是否具有事件机制(std::queue 中的信号)
【发布时间】:2014-08-22 18:22:29
【问题描述】:

队列中是否有任何事件机制或预定义信号。如果任何数据或消息进入队列,队列应该生成一个事件,说明数据已准备好处理。或者向其他线程发出信号来完成他的任务,而不是不断地轮询队列。

在posix消息队列中有类似mq_notify()的函数,如果消息队列中有任何数据,它会通知其他进程或线程,这样我们就可以避免轮询。

编辑

如果没有,那么我该如何在std::queue 上实现这一点。我想避免连续轮询它会降低代码的性能。

每当队列中发生某些事件时,它应该通知其他人。

【问题讨论】:

  • std::deque 不是为直接与线程一起使用而设计的。您必须自己进行同步,包括发出信号。
  • @DonReba 是 AMD 处理器支持的 TBB 队列。
  • @ali786,TBB(线程构建块)是跨平台的。
  • @DonReba 谢谢,我认为它们依赖于架构,只能在英特尔线程 cpu 上执行。
  • 它适用于各种处理器,包括 AMD 的。

标签: c++ multithreading c++11 queue message-queue


【解决方案1】:

有两种方法。最简单的是有一个异步队列,使用互斥锁和条件变量实现,线程阻塞,等待另一个线程将某些内容推送到队列中。这是任务调度的一个非常常见的习惯用法,这里有两个简单的实现:

http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.htmlhttp://cxx-gtk-utils.sourceforge.net/2.2/classCgu_1_1AsyncQueueDispatch.html

通过使用列表而不是双端队列作为队列容器,您可以在队列的互斥体之外分配新节点,从而显着提高高争用下的性能(有关使用 std::list 的示例,请参见上面提到的第二个链接的源代码::splice 来实现这一点)。

不是在异步队列上指定线程块,而是在线程将项目放入队列后,它可以调用程序事件循环中的事件,该事件执行回调,从队列中提取项目并执行某些操作它。实现这一点更加特定于操作系统,但请参阅 http://www.appinf.com/docs/poco/Poco.NotificationQueue.htmlhttp://cxx-gtk-utils.sourceforge.net/2.2/classCgu_1_1Notifier.html 了解不同的方法。

【讨论】:

    【解决方案2】:

    std::queue 是容器类型,而不是事件机制。我建议围绕实现消息队列的队列创建一个类。

    编辑: 好的,所以

    因此,如果您使用具有相同类型的 boost,我建议使用 std::queue、std::mutex 和 std::condition_variable。将它们放在新的 Queue 类中,在推送时,您将锁定互斥锁,推送到队列中,解锁互斥锁,然后 notify_one() 条件。这样条件变量只有在推送时才会被通知。你可以在 pop 上做同样的事情。

    【讨论】:

    • posix还是BSD哪个消息队列,Posix消息队列有事件机制。
    • 你能详细说明我该怎么做吗?
    猜你喜欢
    • 1970-01-01
    • 2021-09-29
    • 2010-11-18
    • 2022-01-20
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    相关资源
    最近更新 更多