7

我正在使用 libfuse 和 glib 事件接口,我遇到了一个问题,我需要同时运行多个主循环(glibg_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);

但是 glib 事件循环不会接收任何触发的事件。我在这里完全不在基地吗?处理多个主循环的正确方法是什么?

4

2 回答 2

4

除了在单独的线程或进程中设置主循环(根据我的一点经验,单独的进程对我来说效果更好,但在你的情况下线程可能会很好地工作),你可以考虑集成 fuse 主循环在 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诺基亚开发者页面上的更多信息)。
希望这可以提供一些提示!

于 2011-12-16T13:26:35.580 回答
4

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

快速搜索表明您可以使用较低级别的 FUSE API 来编写自己的主循环,通过简单地跳过“循环”部分,它可能更容易集成到 GLib 中。

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

于 2011-12-16T04:06:20.267 回答