2012-02-05 6 views
1

У меня есть несколько вопросов относительно libevent2 и его многопоточной поддержки.Поддержка многопоточности Libevent

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

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

Это можно сделать s.th как это с libevent? Или есть ли другие подходы к поддержке нескольких ядер?

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

+0

Я имею в виду сделать что-то подобное (http://stackoverflow.com/ вопросы/21677154/libevent-multithreading-to-handle-http-keep-alive-connections), поэтому мне было интересно, как вы поживаете? Это сработало? Были ли какие-то подводные камни? Любая обратная связь будет наиболее желанной! – SlappyTheFish

ответ

7

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

Было несколько предложенных расширений, которые вы, возможно, захотите изучить. У Марка Эллзи есть библиотека под названием «libevthr», которую он использует для пулов потоков в libevhtp. Вы можете найти it in the libevhtp repository. У Марка Хейли есть предлагаемый патч, чтобы добавить флаг EV_PARALLEL, чтобы Libevent использовал libpthread_workqueue. It appeared on the libevent-users mailing list here.

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

+1

Эй, если я добавлю evthread_use_pthreads(); к моему коду я получаю ошибку: неопределенная ссылка на 'evthread_use_pthreads ' Чтобы скомпилировать, я использую следующую команду:« gcc chat.c -o chat -levent -lpthread », и я полагаю, что мне нужно связать что-то еще, но я не хочу Знаешь что. Не могли бы вы мне помочь? Благодарю. –

7

Если добавить 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