可以运行多个主循环?

ben*_*ier 7 c glib fuse event-loop

我正在使用libfuse和glib事件接口,我遇到了一个问题,我需要同时运行多个主循环(glib g_main_loop_runfuse_loop_mt).

我已经尝试在辅助上下文下为glib的事件循环创建一个分离的线程,例如:

static void *
event_loop(void *arg)
{
  GMainLoop *event_loop;
  GMainContext *context;    

  context = g_main_context_new();
  g_main_context_push_thread_default(context);
  event_loop = g_main_loop_new(context, FALSE);
  g_main_loop_run(event_loop);

  return NULL;
}

...

pthread_t event_thread;
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
event_thread = pthread_create(&event_thread, &thread_attr,
    event_loop, NULL);
Run Code Online (Sandbox Code Playgroud)

但是,glib事件循环不会接收任何触发的事件.我在这里完全偏离基地吗?解决多个主循环的正确方法是什么?

ano*_*ard 5

除了在单独的线程或进程中设置主循环(根据我的一点经验,单独的进程对我来说效果更好,但线程在您的情况下可能效果很好),您可以考虑集成熔丝主循环在 GLib 的主循环中(不幸的是我以前没有这方面的经验)。您可以查看此主题的相同讨论(如果您还没有看到它)。正如线程末尾所建议的那样" Register the fuse device file descriptor (fuse_chan_fd()) with the glib event loop. Then call fuse_chan_recv() and fuse_session_process() when the event trigger"。要跟踪 fd,您需要使用GIO有关诺基亚开发人员页面的更多信息)。
希望这可以提供一些提示!


ehi*_*ird 4

GLib 主循环支持自定义事件源。我对 FUSE 不太了解,但您也许可以在另一个线程中运行 FUSE 的主循环,并将其事件集成到 GLib 循环中。

快速搜索表明您也许可以使用较低级别的 FUSE API 来编写自己的主循环,只需跳过“循环”部分,就可以更轻松地将其集成到 GLib 中。

但总的来说,多个主循环只是坏消息。这就是为什么它们被称为循环。:) 处理它们的最佳方法是通过将事件直接挂钩到最适合您的循环中来消除它们。不幸的是,并非所有 API 都提供足够的钩子来实现这一点。