2011-12-16 10 views
6

私はlibfuseとglibイベントインターフェイスの両方で作業しています。私は複数のメインループを同時に実行する必要がある問題に遭遇しました(glibのg_main_loop_runfuse_loop_mt)。複数のメインループを実行できますか?

私はすでに二次コンテキストでのglibのイベントループ用に作成された切り離されたスレッドにしようとしてきた、例えば: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); 

。私は完全にオフベースですか?複数のメインループに取り組む適切な方法は何ですか?

+0

可能であれば、複数のメインループを避けることをお勧めします。または、イベントループを統合して、1つだけを使用してイベントを受信して​​処理することもできます。 –

+0

残念ながら、それは不可能です。カールハイパーインターフェイスを利用するには、glib(libeventなど)インターフェイスが必要です。明白な理由から、ヒューズはまた、メインループを必要とする。 –

答えて

4

GLibメインループはcustom event sourcesをサポートしています。 FUSEについてはあまりよく分かりませんが、別のスレッド内でFUSEのメインループを実行し、そのイベントをGLibループに統合することができます。

簡単な検索では、下位レベルのFUSE APIを使用してyour own main loopを書き込むことができますが、単に「ループ」部分をスキップするだけでGLibに統合される可能性があります。

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

+0

+1これはおそらくそれを行うには最高の賢明な方法ですが、linux 'eventfd'や' pipe'を使用している場合、Glibのメインループにメッセージを送信するには良い方法でしょう。 glibでほぼ直接使用できるファイル記述子を返します。 – Lalaland

+0

良い点;マルチスレッド化の問題を心配することなく、そこからFUSE(またはGLib)メインループをfork()して実行する方がよいかもしれません。 – ehird

+0

ありがとう、イーサン。私は低レベルのインターフェースに移行しなければならないかもしれないと恐れていました。それは長い一日のように見えます:) –

3

メインループを別のスレッドまたはプロセスに設定することは別としても(私が持っていた少しの経験から、別のプロセスが私にとってうまくいっていましたが、あなたの場合はスレッドがうまくいくかもしれません) 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を追跡するには、GIOMore info on Nokia developer page)を使用する必要があります。
うまくいけば、これはいくつかのヒントを提供することができます!

+0

ありがとう、これはまた役立ちます。 –

関連する問題