Как поделиться обратными вызовами в libevent

Большинство приложений, которые я сделал с помощью libevent, включают один обратный вызов чтения, и всякий раз, когда для запроса открывается новое соединение, я выделяю новое событие с помощью ::event_new(), а затем добавляю это событие в базу событий через ::event_add()

Но проблема в том, что каждый раз, когда открывается новый запрос, я выделяю память и добавляю ее в цикл событий, тогда как на самом деле я должен совместно использовать обратные вызовы и события для файловых дескрипторов. Предоставленное выделение памяти не является узким местом для такого приложения, предлагает ли libevent какой-то способ обмена событиями с несколькими файловыми дескрипторами?


person Curious    schedule 16.06.2017    source источник
comment
Что означает sharing callbacks and events for file descriptors в вашем вопросе? Выделение памяти неизбежно для сохранения состояния соединения для обработки. Состояние event полностью отличается от любого другого события. Как вы можете поделиться этим для достижения различных функций? И file descriptors, когда они не используются (закрыты), повторно используются ОС для select, poll, epoll и т. д. Не могли бы вы уточнить, что именно вы хотите сделать?   -  person Azeem    schedule 16.06.2017
comment
@Azeem, я спросил, так как все события чтения, которые у меня есть, одинаковы, за исключением дескриптора файла, которого они ждут   -  person Curious    schedule 16.06.2017
comment
Можете ли вы привести пример кода? Пожалуйста, отредактируйте свой вопрос с помощью примера вспомогательного кода.   -  person Azeem    schedule 16.06.2017


Ответы (1)


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

Вы можете попробовать переназначить отработанные события с помощью event_assign(), но в документации libevent конкретно указано, что это не рекомендуется. Кроме того, управление отработанными событиями в каком-либо пуле может быть не таким тривиальным, как кажется, и, вероятно, не будет заметного прироста производительности.

person Michaël Roy    schedule 16.06.2017
comment
Не могли бы вы привести пример того, что вы подразумеваете под хаосом? Все события чтения, которые я создаю, одинаковы, за исключением данного файлового дескриптора. Я просто пытаюсь понять правильные шаблоны использования здесь - person Curious; 16.06.2017
comment
События привязаны к сокету и срабатывают при событиях в этом сокете. Присоединение события к более чем одному активному сокету приведет к неопределенному поведению. Это означает, что ваша программа либо сработает сразу, либо будет действовать неопределенным образом, а это означает, что с этого момента может произойти любая ошибка, например, запуск событий на неправильном сокете, мертвый сокет, утечка памяти, невозможность отслеживания повреждение памяти и тому подобное. - person Michaël Roy; 16.06.2017