我正在使用libfuse和glib事件接口,我遇到了一个需要同时运行多个主循环的问题(glib的g_main_loop_run
和fuse_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事件循环不会接收任何触发的事件。我在这里完全偏离基地吗?解决多个主循环的正确方法是什么?
答案 0 :(得分:4)
GLib主循环支持custom event sources。我对FUSE知之甚少,但您可以在另一个线程中运行FUSE的主循环,并将其事件集成到GLib循环中。
快速搜索表明您可以使用较低级别的FUSE API来编写your own main loop,这可以通过简单地跳过“循环”部分而更容易地集成到GLib中。
一般来说,多个主循环只是坏消息;这就是为什么他们被称为主循环。 :)处理它们的最好方法是通过将事件直接挂接到最适合您的循环来消除它们。不幸的是,并非所有的API都提供了足够的钩子来实现这一点。
答案 1 :(得分:4)
除了在单独的线程或进程中设置主循环之外(从我的一点点经验中,单独的进程对我来说效果更好,但是再次线程可能在你的情况下运行良好),你可以考虑集成在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)
希望这可以提供一些提示!