【问题标题】: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 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】:

    libevent使用这种方式合法吗?

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

    evthread_use_pthreads(); // or similar
    

    后来使用BEV_OPT_THREADSAFE 来保证bufferevent 线程安全。

    更多详情请查看in the book

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

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

    需要详细信息。

    【讨论】:

      猜你喜欢
      • 2020-12-14
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多