Поддержка многопоточности Libevent - PullRequest
3 голосов
/ 06 февраля 2012

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

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

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

Естьможно сделать что-то подобное с libevent?Или есть другие подходы для поддержки нескольких ядер?

Большое спасибо

Ответы [ 2 ]

9 голосов
/ 14 мая 2013

Если вы добавите 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
7 голосов
/ 16 февраля 2012

Вам потребуется поддержка пула потоков. Начиная с 2.0.x Libevent не имеет ни одного из этих встроенных в настоящее время, но это может произойти в будущем.

Было несколько предложенных расширений, которые вы могли бы рассмотреть. У Марка Эллзи есть библиотека под названием "libevthr", которую он использует для пулов потоков в libevhtp. Вы можете найти в репозитории libevhtp . У Марка Хейли есть предложенный патч для добавления флага EV_PARALLEL, чтобы позволить Libevent использовать libpthread_workqueue. Он появился в списке рассылки libevent-пользователей здесь.

Если ни один из этих способов не сработает для вас, вы можете сделать это самостоятельно, выбрав любую реализацию рабочей очереди, которая вам нравится, и написав обратный вызов Libevent для автоматической постановки в очередь вашего реального обратного вызова для другого потока.

...