Поддержка многопоточности Libevent

У меня есть несколько вопросов, касающихся libevent2 и его многопоточной поддержки.

Поддерживает ли libevent несколько потоков? То, что я хотел бы достичь, это что-то вроде этого:

  1. Создать event_base в одном потоке.
    • В этом единственном потоке настройки событий и связать их с базой событий. Также зарегистрируйте Обратные вызовы для каждого наблюдаемого события.
  2. Как только происходит наблюдаемое событие, выполните зарегистрированный обратный вызов в каком-то другом (рабочем) потоке.

Можно ли сделать что-то подобное с 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
Другие вопросы по тегам