7

libfuseとglibイベントインターフェイスの両方を使用していますが、複数のメインループ(glibg_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イベントループは、発生したイベントを検出しません。私はここで完全にオフベースですか?複数のメインループに取り組む適切な方法は何ですか?

4

2 に答える 2

4

GLibメインループはカスタムイベントソースをサポートします。FUSEについてはよくわかりませんが、FUSEのメインループを別のスレッド内で実行し、そのイベントをGLibループに統合できる可能性があります。

簡単に検索すると、低レベルのFUSE APIを使用して独自のメインループを作成できる可能性があります。これは、「ループ」部分をスキップするだけで、おそらくGLibに簡単に統合できます。

ただし、一般的に、複数のメインループは悪いニュースです。それがメインループと呼ばれる理由です。:)それらを処理する最良の方法は、あなたに最適なループにイベントを直接フックすることによってそれらを排除することです。残念ながら、すべてのAPIがそれを可能にするのに十分なフックを提供するわけではありません。

于 2011-12-16T04:06:20.267 に答える
4

別のスレッドまたはプロセスでメインループを設定することとは別に(私が経験した少しの経験から、別のプロセスの方がうまくいきましたが、あなたの場合はスレッドがうまくいくかもしれません)、ヒューズのメインループを統合することを検討できます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を追跡するには、使用する必要がありますGIONokia開発者ページの詳細)。
うまくいけば、これはいくつかのヒントを提供することができます!

于 2011-12-16T13:26:35.580 に答える