可以运行多个主循环?

我正在使用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主循环支持自定义事件源 。 我对FUSE知之甚少,但您可以在另一个线程中运行FUSE的主循环,并将其事件集成到GLib循环中。

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

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

除了在一个单独的线程或一个进程中设置主循环(从我所拥有的一点点经验中,单独的进程对我来说效果更好但是再次线程可能在你的情况下运行良好),你可以考虑集成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 ( 诺基亚开发者页面上的更多信息 )。
希望这可以提供一些提示!