2015-10-21 3 views
0

У меня есть проект, который я преобразовываю из обычного select(), но из-за теста, который я запускал, у которого было более 1000 соединений, я решил изменить это на epoll.EPOLL и голод входящего потока

У меня есть код, который работает, но столкнулся с проблемой, которую я пытаюсь решить, и это лучший способ исправить.

В системе имеется поток данных libcurl, извлекающий данные из внешнего источника, который хранится в памяти в ожидании съемников, соединяющих и принимающих данные.

Все хорошо, когда исходные данные завершены, но когда кто-то подключается, пока я загружаю новые данные, и они достаточно быстры, чтобы догнать поток libcurl, они попадают в состояние голода.

Вопрос в том, как перезапустить съемники, не устанавливая EPOLLOUT, и когда epoll_wait постоянно говорит мне, что в буфере есть место.

Мои варианты

  1. EPOLLOUT, вызовет много epoll_waits, чтобы сказать мне буфер пуст, пока не будет доступен некоторые данные.

  2. Таймер, как я решу задержку:

  3. Есть список соединений и, когда новые данные поступают в посыле данных из Libcurl нити, которую я не хотел делать.

  4. какой-то сигнал от нитки libcurl до цикла epoll, КАК?

Любые другие идеи

ответ

0

Вы можете использовать дескриптор файла eventfd(), чтобы позволить загрузку нить будить epolling нить, когда больше данных прибыли.

Непонятно, почему вам не приходилось решать ту же проблему в вашей реализации select().

+0

2048 макс. Розетки без возиться. И чтение нескольких потоков о epoll масштабируется лучше. Heres надеется –

+0

@JulianGardner: Конечно, я понимаю, почему вы решили использовать 'epoll()' over' select() ', но я спрашиваю, почему у вас не было той же проблемы, что и при загрузке потоков к загрузке потоков в реализацию 'select()'? – caf

+0

Я сделал, но я использовал небольшой тайм-аут на выбор, чтобы преодолеть это, так же, как если бы я постоянно сохранял EPOLLOUT. –

Смежные вопросы