Poco Poco :: NotificationQueue没有按预期工作

时间:2014-01-14 10:44:06

标签: c++ multithreading notifications poco

我开始使用Poco::NotificationQueue。我注意到这种奇怪的行为,如果有多个工作线程在使用NotificationQueue的同一waitDequeueNotification()上等待,则只有一个工作线程接收到从主线程发送的通知。 如果您运行Poco提供的NotificationQueue.cpp示例(在本例中是从Visual Studio完成,但在Linux上测试时结果相同),这是显而易见的。

它的输出是:

Worker 1 got work notification 0
Worker 3 got work notification 2
Worker 2 got work notification 1
Worker 1 got work notification 3
Worker 3 got work notification 4
Worker 2 got work notification 5
...

预期结果将是:

Worker 1 got work notification 0
Worker 3 got work notification 0
Worker 2 got work notification 0
Worker 1 got work notification 1
Worker 3 got work notification 1
Worker 2 got work notification 1
.....

这是一个错误还是什么?如果是,有任何解决方法吗?

2 个答案:

答案 0 :(得分:1)

实际上它的设计意图。您正在获取调用waitDequeueNotification()dequeueNotification()的新通知。这两个函数都会收到通知,并将其从相应的队列中删除。

如果您希望通知每个工作线程,您需要单独发送每个线程的通知(每个工作线程应该有自己的队列)。

答案 1 :(得分:1)

这不是错误,但你的期望是错误的。

NotificationQueue旨在通知Worker个线程有关要完成的工作。每个Notification代表一个要完成的工作。如果Worker 1已经在处理该任务,为什么下一个免费Worker开始处理同一任务?多线程的全部使用是工作的并行化。因此,可以同时处理多个作业。

如果您希望每个主题获得相同的Notification,则使用NotificationQueue。相反,您应该使用NotificationCenterObservers

有关详细信息,请参阅这些幻灯片:NotificationsEvents.pdf