libevent 是不是允许在不同的线程中运行定时器/io 的回调?
Posted
技术标签:
【中文标题】libevent 是不是允许在不同的线程中运行定时器/io 的回调?【英文标题】:Does libevent allow to run callback for timer/io in a different thread?libevent 是否允许在不同的线程中运行定时器/io 的回调? 【发布时间】:2019-11-06 06:40:29 【问题描述】:由于某些应用程序原因,我需要在不同的线程中为计时器/io 事件运行回调。
例子:
void EventLoop::createIOEvent(int fd, short kind, event_cb originalCallback, void* originalUserData)
...
const auto datastd::make_shared<UserData>(originalUserData, originalCallback, callbackExecutor);
event* eventevent_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】:libevent使用这种方式合法吗?
因此可以从多个线程访问 event/event_base,在这种情况下,您需要为 libevent 启用线程支持:
evthread_use_pthreads(); // or similar
后来使用BEV_OPT_THREADSAFE
来保证bufferevent
线程安全。
更多详情请查看in the book。
即使您的方法在此修改后应该可以工作,但这并不是一个好的设计选择。创建事件工作者(单独的event_base
+ 线程)并在后台线程的event_base
中安排您的事件(event_add
)会更好。
Android 我的测试应用程序无故关闭。
需要详细信息。
【讨论】:
以上是关于libevent 是不是允许在不同的线程中运行定时器/io 的回调?的主要内容,如果未能解决你的问题,请参考以下文章