GOOGLE ADS

четверг, 14 апреля 2022 г.

Являются ли потокобезопасными события event_base_loop и event_base_dispatch?

Являются ли потокобезопасными функции 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().

В настоящее время только один поток может одновременно отправлять данную базу событий. Если вы хотите запускать события в нескольких потоках одновременно, у вас может быть либо одна база событий, события которой добавляют работу в рабочую очередь, либо вы можете создать несколько объектов базы событий.

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...