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