【问题标题】:Possible to run multiple main loops?可以运行多个主循环吗?
【发布时间】:2011-12-16 03:37:57
【问题描述】:

我正在使用 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);

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

【问题讨论】:

  • 我猜最好的方法是尽可能避免多个主循环。或者集成事件循环,这样您就可以只使用一个来接收和处理事件。
  • 不幸的是,这是不可能的。我需要 glib(libevent 等)接口来利用 curl hiper 接口。保险丝,出于显而易见的原因,还需要一个主循环。

标签: c glib fuse event-loop


【解决方案1】:

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

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

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

【讨论】:

  • +1 这可能是最明智的做法,但我想补充一点,如果您使用的是 linux,eventfdpipe 可能是发送消息的好方法Glib 主循环,因为它们返回几乎可以直接与 glib 一起使用的文件描述符。
  • 好点;它甚至可能比fork() 更可取,并从那里运行 FUSE(或 GLib)主循环,而不必担心多线程的任何问题。
  • 谢谢,伊桑。我担心我可能不得不移动到低级界面。看起来这将是漫长的一天:)
【解决方案2】:

除了在单独的线程或进程中设置主循环(根据我的一点经验,单独的进程对我来说效果更好,但在你的情况下线程可能会很好地工作),你可以考虑集成在 GLib 的主循环中融合主循环(不幸的是,我没有这方面的经验)。您可以检查this thread discussion 大致相同(如果您还没有看到它)。正如线程 " 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(More info on Nokia developer page)。
希望这可以提供一些提示!

【讨论】:

  • 谢谢,这也很有帮助。
猜你喜欢
  • 1970-01-01
  • 2019-08-15
  • 1970-01-01
  • 2020-01-01
  • 2016-06-09
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多