我开始使用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 .....
这是一个错误还是什么?如果是,有任何解决方法吗?
答案 0 :(得分:1)
实际上它的设计意图。您正在获取调用waitDequeueNotification()
或dequeueNotification()
的新通知。这两个函数都会收到通知,并将其从相应的队列中删除。
如果您希望通知每个工作线程,您需要单独发送每个线程的通知(每个工作线程应该有自己的队列)。
答案 1 :(得分:1)
这不是错误,但你的期望是错误的。
NotificationQueue
旨在通知Worker
个线程有关要完成的工作。每个Notification
代表一个要完成的工作。如果Worker
1已经在处理该任务,为什么下一个免费Worker
开始处理同一任务?多线程的全部使用是工作的并行化。因此,可以同时处理多个作业。
如果您希望每个主题获得相同的Notification
,则不使用NotificationQueue
。相反,您应该使用NotificationCenter
和Observers
。
有关详细信息,请参阅这些幻灯片:NotificationsEvents.pdf