Possible d’exécuter plusieurs boucles principales?

Je travaille avec libfuse et l’interface d’événement glib et j’ai rencontré un problème qui me g_main_loop_run à exécuter plusieurs boucles principales simultanément ( g_main_loop_run et fuse_loop_mt ).

J’ai déjà essayé de créer un thread détaché pour la boucle d’événements de glib dans un contexte secondaire, par exemple:

 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); 

Cependant, la boucle d’événement glib ne détecte aucun des événements déclenchés. Suis-je totalement hors de la base ici? Quelle est la bonne façon de s’attaquer à plusieurs boucles principales?

La boucle principale de GLib prend en charge des sources d’événements personnalisées . Je ne connais pas grand chose à FUSE, mais vous pourrez peut-être exécuter la boucle principale de FUSE dans un autre thread et intégrer ses événements à la boucle GLib.

Une recherche rapide suggère que vous pourriez utiliser une API FUSE de niveau inférieur pour écrire votre propre boucle principale. Celle -ci pourrait probablement être intégrée plus facilement dans GLib en sautant simplement la partie “boucle”.

En général, cependant, plusieurs boucles principales ne sont que de mauvaises nouvelles. c’est pourquoi on les appelle boucles principales . 🙂 La meilleure façon de les gérer est de les éliminer en accrochant les événements directement à la boucle qui vous convient le mieux. Malheureusement, toutes les API ne fournissent pas suffisamment de points d’accroche pour rendre cela possible.

En plus de la configuration des boucles principales dans un thread ou un processus séparé (du peu d’expérience que j’ai eue, un processus séparé a mieux fonctionné pour moi, mais là encore, le thread pourrait bien fonctionner dans votre cas), vous pouvez envisager d’intégrer la boucle principale de fusible. dans la boucle principale de GLib (malheureusement, je n’ai aucune expérience en la matière). Vous pouvez consulter cette discussion sur le même sujet (au cas où vous ne l’ayez pas déjà vue). Comme suggéré à la fin du fil " 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 sortinggger" . Pour suivre le fd, vous devez utiliser GIO ( Plus d’informations sur la page des développeurs Nokia ).
J’espère que cela peut fournir des indices!