Poco Poco::NotificationQueue 未按预期工作

Poco Poco::NotificationQueue not working as expected

本文关键字:Poco 工作 NotificationQueue      更新时间:2023-10-16

我开始使用Poco::NotificationQueue .我注意到这种奇怪的行为,如果多个工作线程使用waitDequeueNotification()在同一NotificationQueue上等待,则只有一个胎面接收从主线程发送的通知。如果您运行 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
.....

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

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

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

如果希望每个线程接收相同的Notification,则不应使用NotificationQueue。相反,您应该使用带有ObserversNotificationCenter

有关详细信息,请参阅以下幻灯片:通知事件.pdf

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

如果您希望通知每个工作线程

,则需要为每个线程单独发送通知(每个工作线程都应该有自己的队列)。