【发布时间】:2011-09-09 17:09:09
【问题描述】:
我正在尝试使用 mq_notify 调用来启动具有 POSIX 消息队列的线程。一切似乎都正确,但我只有一个线程,它处理所有消息,但它永远不会终止。我的印象是我会得到新的线程来处理,这似乎不对。
【问题讨论】:
标签: c++ c linux posix message-queue
我正在尝试使用 mq_notify 调用来启动具有 POSIX 消息队列的线程。一切似乎都正确,但我只有一个线程,它处理所有消息,但它永远不会终止。我的印象是我会得到新的线程来处理,这似乎不对。
【问题讨论】:
标签: c++ c linux posix message-queue
首先,mq_notify() 一次只会启动一个线程。其次,不是每次将消息放入队列时都启动线程;它们仅在已为空的队列收到新消息时启动。第三,mq_notify() 是一次性交易。一旦一个线程被触发,如果你想在下一次空队列接收到一条消息时触发一个新线程,你需要用 mq_notify() 重新注册。通常你的 threadfunc 应该做的第一件事就是重新注册。
由于您正在启动一个线程并处理消息,我的猜测是您没有将队列打开为 O_NONBLOCK 或使用 mq_setattr() 将其重置为此类。当一个线程触发时,您希望排空队列中的所有消息,以便下次可以启动另一个线程。如果队列处于阻塞模式,您将在收到最后一条消息后阻塞,线程将永远不会结束。在非阻塞模式下,您希望继续阅读,直到获得 errno == EAGAIN 然后结束线程。您应该很高兴使用新线程来获取下一批消息。
【讨论】: