Являются ли потокобезопасными функции event_base_loop()(поток издателя) и event_base_dispatch()(поток подписчика)? Недавно я проверил свое приложение на наличие ошибок синхронизации с помощью valgrind's helgrindинструмента. В отчете упоминается, что существует состояние гонки между event_base_loop()и event_base_dispatch()хотя обе эти функции вызываются с разными struct event_baseпеременными ( struct event_base base_pub(поток издателя) и struct event_base base_sub(поток подписчика)). Ниже приведен пример кода
Тема издателя
struct event_base base_pub = event_base_new();
while (true) {
... // publish data
event_base_loop(base_pub, EVLOOP_NONBLOCK);
sleep(1);
...
}
Тема подписчика
struct event_base base_sub = event_base_new();
while (true) {
... // register subscriber callback function
event_base_dispatch(base_sub);
...
}
Решение проблемы
Они потокобезопасны, если вы включите переменные блокировки/условия через:
evthread_use_pthreads();
Вам также необходимо установить связь с libevent_pthreads. Обратите внимание, что:
Прежде чем вызывать какие-либо другие функции Libevent, необходимо настроить библиотеку. Если вы собираетесь использовать Libevent из нескольких потоков в многопоточном приложении, вам необходимо инициализировать поддержку потоков — обычно с помощью evthread_use_pthreads() или evthread_use_windows_threads().
В настоящее время только один поток может одновременно отправлять данную базу событий. Если вы хотите запускать события в нескольких потоках одновременно, у вас может быть либо одна база событий, события которой добавляют работу в рабочую очередь, либо вы можете создать несколько объектов базы событий.
Комментариев нет:
Отправить комментарий