Как разбудить поток после получения 2 пакетов - PullRequest
3 голосов
/ 23 ноября 2010

Я использую libnetfilter_queue для своего проекта. Из приложения C очередь доступна через «дескриптор файла очереди». У меня есть 5 очередей и 5 потоков для их обработки. Чего я хочу добиться, так это разбудить поток, когда в очереди ровно 2 пакета. Мне пришла в голову идея использовать функцию выбора и массив значений, указывающих, сколько пакетов было поставлено в очередь в каждой очереди. После выбора выхода с кодом> 0 я проверяю, какая очередь получила пакет и значение приращения в массиве, если оно больше 2, я просыпаюсь в потоке. Все было бы хорошо, но выбор указывает, что в очереди есть данные для чтения, пока я не вызову recv, и я не могу этого сделать, потому что отдельный поток должен обрабатывать эти пакеты. У кого-нибудь есть идеи, как решить эту проблему? Я знаю, что могу установить SO_RCVLOWAT, но это не решает мою проблему, потому что я не знаю, какого размера будут эти 2 пакета.

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Как рекомендует Тобу, epoll - лучший выбор, и он работает лучше, чем select.Тем не менее, большинство из этих функций опроса будут указывать, что есть событие (данные доступны), если кто-то не читает.Если возможно, используйте следующую модель: Используйте epoll / select, чтобы отслеживать поступающие данные, которые пробуждают рабочий поток.Пусть рабочий поток решит, что делать с данными (один пакет, два или более), прежде чем фактически выполнять работу.

ИЛИ: Один поток Reader-N Рабочие потоки: будет использовать epoll для ожидания и чтения всехвходящие данные и отправить их в очередь соответствующего рабочего потока.Когда количество пакетов достигнет порогового значения, разбудите рабочий поток (используя семафор).

1 голос
/ 24 ноября 2010

Вы ищете уведомления о событиях, инициируемых по фронту - уведомления, которые отправляются при изменении количества доступных данных. epoll работает так же, когда используется флаг EPOLLET, и по умолчанию перезапускает уведомление, так что вы будете получать уведомления о новых пакетах.

Обратите внимание, что вы будете уведомлены только один раз, еслипакеты приходят между двумя вызовами epoll_wait.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...