【问题标题】:mq_notify only starts one threadmq_notify 只启动一个线程
【发布时间】:2011-09-09 17:09:09
【问题描述】:

我正在尝试使用 mq_notify 调用来启动具有 POSIX 消息队列的线程。一切似乎都正确,但我只有一个线程,它处理所有消息,但它永远不会终止。我的印象是我会得到新的线程来处理,这似乎不对。

【问题讨论】:

    标签: c++ c linux posix message-queue


    【解决方案1】:

    首先,mq_notify() 一次只会启动一个线程。其次,不是每次将消息放入队列时都启动线程;它们仅在已为空的队列收到新消息时启动。第三,mq_notify() 是一次性交易。一旦一个线程被触发,如果你想在下一次空队列接收到一条消息时触发一个新线程,你需要用 mq_notify() 重新注册。通常你的 threadfunc 应该做的第一件事就是重新注册。

    由于您正在启动一个线程并处理消息,我的猜测是您没有将队列打开为 O_NONBLOCK 或使用 mq_setattr() 将其重置为此类。当一个线程触发时,您希望排空队列中的所有消息,以便下次可以启动另一个线程。如果队列处于阻塞模式,您将在收到最后一条消息后阻塞,线程将永远不会结束。在非阻塞模式下,您希望继续阅读,直到获得 errno == EAGAIN 然后结束线程。您应该很高兴使用新线程来获取下一批消息。

    【讨论】:

    • 非常感谢鸭子。非阻塞做到了。回想起来似乎很明显。
    猜你喜欢
    • 2023-01-16
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多