我正在尝试使用mq_notify调用来启动带有POSIX消息队列的线程。一切似乎都是正确的,但我只得到一个线程,它处理所有消息,但它永远不会终止。我的印象是我会得到新的线程来处理,这似乎不对。
答案 0 :(得分:3)
首先,mq_notify()一次只能启动一个线程。其次,每次将消息放入队列时都不会启动线程;它们仅在已空的队列获得新消息时启动。第三,mq_notify()是一次性交易。一旦线程被触发,如果你想在下一次空队列收到消息时触发一个新线程,你需要重新注册mq_notify()。通常,你的threadfunc应该做的第一件事就是重新注册。
由于您正在启动一个线程并处理消息,我的猜测是您没有将队列打开为O_NONBLOCK或使用mq_setattr()将其重置为此类型。当一个线程触发时,你想要排空所有消息的队列,这样下一次可以启动另一个线程。如果队列处于阻塞模式,您将在收到最后一条消息后阻塞,并且该线程永远不会结束。在非阻塞模式下,你想继续阅读,直到你得到errno == EAGAIN,然后结束线程。你应该很高兴用新的线程去下一批消息。