2011-06-07 242 views
2

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

回答

3

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

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

+0

非常感谢Duck。非阻塞做到了。回想起来似乎很明显。 – 2011-06-07 01:42:47