【问题标题】:Poco Poco::NotificationQueue not working as expectedPoco Poco::NotificationQueue 未按预期工作
【发布时间】:2014-01-14 10:44:06
【问题描述】:

我开始使用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
.....

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

【问题讨论】:

    标签: c++ multithreading notifications poco


    【解决方案1】:

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

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

    如果您希望每个线程接收相同的Notification,您应该使用NotificationQueue。相反,您应该使用 NotificationCenterObservers

    查看这些幻灯片了解更多信息:NotificationsEvents.pdf

    【讨论】:

      【解决方案2】:

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

      如果你想通知每个工作线程,你需要为每个线程分别发送通知(每个工作线程应该有自己的队列)。

      【讨论】:

        猜你喜欢
        • 2013-03-10
        • 2014-06-13
        • 2021-06-04
        • 2022-01-24
        • 2015-05-11
        • 2020-05-15
        • 2014-10-31
        • 2018-02-12
        • 2014-01-20
        相关资源
        最近更新 更多