2011-12-16 7 views
6

나는 libfuse와 glib 이벤트 인터페이스를 모두 사용하고 있으며 다중 주 루프를 동시에 실행해야하는 문제가 발생했습니다 (glib의 g_main_loop_runfuse_loop_mt).여러 주 루프를 실행할 수 있습니까?

이미 보조 컨텍스트에서 입심의 이벤트 루프에 대해 생성 분리 된 스레드를 시도했습니다, 예컨대 : 입심 이벤트 루프가 트리거되는 이벤트 중 하나에서 선택하지 않는 그러나

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

가능한 한 여러 주 루프를 피하는 것이 가장 좋을 것 같습니다. 또는 하나만 사용하여 이벤트를 수신하고 처리 할 수 ​​있도록 이벤트 루프를 통합하십시오. –

+0

불행히도, 그건 불가능합니다. 컬 하이퍼 인터페이스를 사용하기 위해 glib (libevent, etc ..) 인터페이스가 필요합니다. 분명한 이유 때문에 퓨즈는 또한 메인 루프가 필요합니다. –

답변

4

GLib 메인 루프는 custom event sources을 지원합니다. FUSE에 대해 많이 알지는 못하지만 다른 스레드에서 FUSE의 메인 루프를 실행하고 이벤트를 GLib 루프에 통합 할 수 있습니다.

빠른 검색을 사용하면 더 낮은 수준의 FUSE API를 사용하여 your own main loop을 작성할 수 있습니다. 이는 단순히 "루프"부분을 건너 뛰어 GLib에보다 쉽게 ​​통합 될 수 있습니다.

그러나 일반적으로 여러 주 루프는 나쁜 소식입니다. 그래서 그들은 메인 루프라고합니다. :) 그들을 처리하는 가장 좋은 방법은 이벤트를 자신에게 가장 적합한 루프에 직접 연결하여 제거하는 것입니다. 불행히도 모든 API가이를 가능하게하는 충분한 고리를 제공하지는 않습니다.

+0

+1 아마이 방법을 사용하는 것이 가장 현명한 방법 일 것입니다. 리눅스를 사용한다면'eventfd' 또는'pipe'가 Glib 메인 루프에 메시지를 보내는 좋은 방법 일 것입니다. glib에서 거의 직접 사용할 수있는 파일 설명자를 반환합니다. – Lalaland

+0

좋은 지적; 멀티 스레딩 문제를 걱정할 필요없이 FUN (또는 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를 추적하려면 GIO (More info on Nokia developer page)을 사용해야합니다.
바라건대 이것은 약간의 힌트를 제공 할 수 있습니다!

+0

고마워, 이것도 도움이됩니다. –