C 可以运行多个主循环吗?

C 可以运行多个主循环吗?,c,glib,fuse,event-loop,C,Glib,Fuse,Event Loop,我正在使用libfuse和glib事件接口,遇到了一个问题,我需要同时运行多个主循环(glib的g\u main\u loop\u run和fuse\u loop\u mt) 我已经尝试在次要上下文下为glib的事件循环创建分离线程,例如: static void * event_loop(void *arg) { GMainLoop *event_loop; GMainContext *context; context = g_main_context_new();

我正在使用libfuse和glib事件接口,遇到了一个问题,我需要同时运行多个主循环(glib的
g\u main\u loop\u run
fuse\u loop\u 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主循环支持。我对FUSE了解不多,但是您可以在另一个线程中运行FUSE的主循环,并将其事件集成到GLib循环中

快速搜索表明,您可能可以使用较低级别的FuseAPI来编写,只需跳过“循环”部分,就可以更容易地将其集成到GLib中


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

除了在单独的线程或进程中设置主循环之外(根据我的一点经验,单独的进程对我来说效果更好,但是线程在您的情况下可能会很好),您可以考虑在GLib的主回路中集成保险丝主回路(不幸的是,我以前没有这种经验)。你可以检查一下(如果你还没有看到的话)。按照线程
末尾的建议,注册保险丝设备文件描述符
(fuse_chan_fd())和glib事件循环。然后调用fuse_chan_recv()
并在事件触发“
时融合会话进程()。要跟踪fd,您需要使用()。

希望这能提供一些提示

我想最好的办法是尽可能避免多个主循环。或者集成事件循环,以便您只能使用一个来接收和处理事件。不幸的是,这是不可能的。我需要glib(libevent等)接口来利用curl-hiper接口。Fuse,出于明显的原因,也需要一个主循环。+1这可能是最好的可行方法,但我想补充一些,如果您使用linux
eventfd
pipe
可能是向Glib主循环发送消息的好方法,因为它们返回的文件描述符几乎可以直接用于glib.Good point;甚至最好是
fork()
并从那里运行FUSE(或GLib)主循环,而不用担心多线程的任何问题。谢谢,Ethan。我担心我可能不得不转到低级界面。看起来这将是漫长的一天:)谢谢,这也很有帮助。