mq_notify запускает только один поток - PullRequest
2 голосов
/ 07 июня 2011

Я пытаюсь использовать вызов mq_notify, чтобы инициировать поток с очередями сообщений POSIX.Все кажется правильным, но я получаю только один поток, и он обрабатывает все сообщения, но никогда не завершается.У меня сложилось впечатление, что я получу новые потоки для обработки, и это кажется неправильным.

1 Ответ

3 голосов
/ 07 июня 2011

Во-первых, mq_notify () будет запускать только один поток за раз.Во-вторых, потоки не запускаются каждый раз, когда сообщение помещается в очередь;они запускаются только тогда, когда очередь, которая была пуста, получает новое сообщение.В-третьих, mq_notify () - одноразовая сделка.После того, как поток запущен, если вы хотите запустить новый, в следующий раз, когда пустая очередь получит сообщение, вам необходимо заново зарегистрироваться в mq_notify ().Обычно одно из первых действий, которое должен выполнять ваш threadfunc, - это перерегистрация.

Поскольку вы запускаете поток и обрабатываете сообщения, я предполагаю, что вы не открыли очередь как O_NONBLOCK или не сбросили ее до значения с помощью mq_setattr).Когда поток запускается, вы хотите опустошить очередь всех сообщений, чтобы другой поток мог запуститься в следующий раз.Если очередь находится в режиме блокировки, вы собираетесь заблокировать ее после получения последнего сообщения, и поток никогда не закончится.В неблокирующем режиме вы хотите продолжить чтение, пока не получите errno == EAGAIN, а затем закончите поток.Вы должны быть готовы перейти к следующей партии сообщений с новой темой.

...