std :: queue是否具有事件机制(std :: queue中的信号)

时间:2014-07-02 04:40:12

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

队列中是否有任何事件机制或预定义信号。如果队列中有任何数据或消息,则队列应生成一个表示数据已准备好处理的事件。或者发信号通知其他线程执行他的任务而不是连续轮询到队列。

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

修改

如果没有,那么我怎样才能在std::queue上实现这一点。我想避免不断轮询,这会降低代码的性能。

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

2 个答案:

答案 0 :(得分:3)

std :: queue是一种包含类型,而不是事件机制。我建议在实现消息队列的队列周围创建一个类。

编辑: 好的,所以

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

答案 1 :(得分: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

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

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