Разрешает ли libevent запуск обратного вызова для timer / io в другом потоке? - PullRequest
0 голосов
/ 06 ноября 2019

Из-за некоторых причин применения мне нужно запустить обратный вызов для событий timer / io в другом потоке.

Пример:

void EventLoop::createIOEvent(int fd, short kind, event_cb originalCallback, void* originalUserData) 
{
    ...
    const auto data{std::make_shared<UserData>(originalUserData, originalCallback, callbackExecutor)};
    event* event{event_new(_eventBase, fd, kind, EventLoop::asyncCall, data.get())};
    event_add(event, nullptr);
    ...
}

void EventLoop::asyncCall(int fd, short kind, void* data)
{
    const auto userData{*(reinterpret_cast<UserData*>(data))};
    ExecutorWrapper(userData._callbackExecutor)
        .addRunnable([=]() {
            userData._originalCallback(fd, kind, userData._originalUserData);
    })
    .exec();
 }

Допустимо ли использование такого подхода для libevent?

Примечание: кажется, что все отлично работает на Macos и iOS, но на Android мой тестПриложение просто закрывается без каких-либо причин.

1 Ответ

2 голосов
/ 06 ноября 2019

Законно ли для libevent использовать такой подход?

Таким образом, доступ к event / event_base может быть сделан из нескольких потоков, в этом случае вам необходимо включить поддержку потоков для libevent:

evthread_use_pthreads(); // or similar

И позже используйте BEV_OPT_THREADSAFE для bufferevent поточной безопасности.

Для получения более подробной информации посмотрите в книге .

И хотя ваш подход должен работать после этих модификаций, он не является хорошим выбором для дизайна. Будет намного лучше создавать рабочих событий (отдельный поток event_base +) и планировать свое событие (event_add) в event_base фонового потока.

Android мое тестовое приложениепросто закрывается без каких-либо причин.

нужны детали.

...