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 的回调?的主要内容,如果未能解决你的问题,请参考以下文章

高性能I/O框架库Libevent

同一 fd 上不同线程中的多个 libevent 基础

libevent 线程池的设计

libevent:如果事件是由 malloc 创建的,是不是允许在其回调函数中释放事件

nodejs 与运行 libevent 有何不同?

浅析libevent