libevent是否允许在不同的线程中运行timer/io的回调

Does libevent allow to run callback for timer/io in a different thread?

本文关键字:运行 timer 回调 io 线程 libevent 是否      更新时间:2023-10-16

由于一些应用程序的原因,我需要在不同的线程中运行定时器/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上,我的测试应用程序毫无理由地关闭了。

libevent使用这种方法合法吗?

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

evthread_use_pthreads(); // or similar

稍后将BEV_OPT_THREADSAFE用于bufferevent线程安全。

有关更多详细信息,请参阅本书。

即使你的方法在修改后应该可以工作,但这不是一个好的设计选择。创建事件工作者(单独的event_base+线程(并在后台线程的event_base中安排事件(event_add(会更好。

Android我的测试应用程序在没有任何原因的情况下关闭。

需要详细信息。