Поддержка многопоточности Libevent
У меня есть несколько вопросов, касающихся libevent2 и его многопоточной поддержки.
Поддерживает ли libevent несколько потоков? То, что я хотел бы достичь, это что-то вроде этого:
- Создать event_base в одном потоке.
- В этом единственном потоке настройки событий и связать их с базой событий. Также зарегистрируйте Обратные вызовы для каждого наблюдаемого события.
- Как только происходит наблюдаемое событие, выполните зарегистрированный обратный вызов в каком-то другом (рабочем) потоке.
Можно ли сделать что-то подобное с libevent? Или есть другие подходы для поддержки нескольких ядер?
большое спасибо
2 ответа
Вам потребуется поддержка пула потоков. Начиная с 2.0.x Libevent не имеет ни одного из этих встроенных в настоящее время, но это может произойти в будущем.
Было несколько предложенных расширений, которые вы могли бы рассмотреть. У Марка Эллзи есть библиотека под названием "libevthr", которую он использует для пулов потоков в libevhtp. Вы можете найти его в репозитории libevhtp. У Марка Хейли есть предложенный патч для добавления флага EV_PARALLEL, чтобы позволить Libevent использовать libpthread_workqueue. Он появился в списке рассылки libevent-пользователей здесь.
Если ни один из этих способов не сработает для вас, вы можете сделать это самостоятельно, выбрав любую реализацию рабочей очереди, которая вам нравится, и написав обратный вызов Libevent, чтобы автоматически поставить в очередь ваш реальный обратный вызов для другого потока.
Если вы добавите evthread_use_pthreads();
Вы должны иметь -levent_pthreads
Пример:
gcc chat.c -o chat -levent -lpthread -levent_threads
а также:
$> ls /usr/lib/libevent*.a
/usr/lib/libevent.a /usr/lib/libevent_core.a /usr/lib/libevent_extra.a /usr/lib/libevent_openssl.a /usr/lib/libevent_pthreads.a