libevent是否允许在其他线程中运行timer / io的回调?

问题描述 投票:0回答:1

由于某些应用程序原因,我需要在其他线程中为计时器/ 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上我的测试应用程序无故关闭。

c++ c libevent
1个回答
0
投票

libevent使用这种方法合法吗?

因此可以从多个线程访问event / event_base,在这种情况下,您需要为libevent启用线程支持:

evthread_use_pthreads(); // or similar

并且以后将BEV_OPT_THREADSAFE用于bufferevent线程安全。

有关更多详细信息,请看in the book

即使您的方法在修改后仍然可以使用,但这并不是一个好的设计选择。创建事件工作程序(分离event_base +线程)并将事件(event_add)安排在后台线程的event_base中会更好。

Android我的测试应用程序无故关闭。

需要详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.