Можно ли запустить несколько основных циклов? - PullRequest
7 голосов
/ 16 декабря 2011

Я работаю как с libfuse, так и с интерфейсом событий glib, и столкнулся с проблемой, когда мне нужно запустить несколько основных циклов одновременно (glib's g_main_loop_run и fuse_loop_mt).

IВы уже пытались создать отдельный поток для цикла событий 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 не обнаруживает ни одно из запущенных событий.Я полностью вне базы?Как правильно справиться с несколькими основными циклами?

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Помимо настройки основных циклов в отдельном потоке или процессе (из моего небольшого опыта, отдельный процесс работал лучше для меня, но опять же поток мог бы работать хорошо в вашем случае), вы можете рассмотреть возможность интеграции Основной цикл предохранителя в главном цикле 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 ( Подробнее на странице разработчика Nokia ).
Надеемся, что это может дать некоторые подсказки!

4 голосов
/ 16 декабря 2011

Основной цикл GLib поддерживает пользовательские источники событий .Я мало что знаю о FUSE, но вы можете запустить основной цикл FUSE в другом потоке и интегрировать его события в цикл GLib.

Быстрый поиск предполагает, что вы можете использоватьFUSE API более низкого уровня для записи вашего собственного основного цикла , который, вероятно, можно было бы более легко интегрировать в GLib, просто пропуская часть "loop".просто плохие новости;именно поэтому они называются main loop.:) Лучший способ справиться с ними - это устранить их, подключив события непосредственно в любой цикл, который вам больше подходит.К сожалению, не все API предоставляют достаточное количество хуков, чтобы сделать это возможным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...