2011-06-07 238 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