我同时使用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事件循环不会接收到任何已触发的事件。我是不是完全离开基地了?处理多个主循环的正确方法是什么?
最佳答案
glib主循环支持custom event sources。我对fuse了解不多,但是您可以在另一个线程中运行fuse的主循环,并将其事件集成到glib循环中。
快速搜索表明,您可以使用较低级别的fuse api来编写your own main loop,这可能通过跳过“循环”部分更容易集成到glib中。
不过,一般来说,多个主循环只是坏消息;这就是为什么它们被称为主循环。:)处理它们的最佳方法是通过将事件直接挂接到对您最有效的循环中来消除它们。不幸的是,并不是所有的api都提供了足够的钩子来实现这一点。
关于c - 可能运行多个主循环?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8529483/