2011-12-16 38 views
6

(glib en g_main_loop_run ve fuse_loop_mt).Birden çok ana döngüyü çalıştırmak mümkün mü? Hem libfuse ve geveze olay arayüzü ile çalışıyorum ve ben aynı anda birden fazla ana döngüler çalıştırmak için gereken bir sorun haline çalıştırmak

Zaten ikincil bağlamında glib olay döngü için oluşturulan müstakil bir iş parçacığı teşebbüs ettik ör .: hitabet olay döngü ateş olayların hiçbirinde atlyor Ancak

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

. Burada tamamen üste mi kaldım? Birden çok ana döngüyü ele almanın doğru yolu nedir?

+0

iyi yolu tamamen mümkünse birden ana döngüler önlemek olacaktır. Alternatif olarak etkinlik döngülerini entegre edin, böylece olayları almak ve işlemek için yalnızca bir tane kullanabilirsiniz. –

+0

Maalesef bu mümkün değil. Curl hiper arayüzünü kullanmak için glib (libevent, vs ..) arayüzüne ihtiyacım var. Sigorta, açık nedenlerden dolayı ana bir döngüye de ihtiyaç duyar. –

cevap

4

GLib ana döngü custom event sources destekler. FUSE hakkında pek bir şey bilmiyorum, ancak FUSE'nin ana döngüsünü başka bir iş parçacığı içinde çalıştırabilir ve olaylarını GLib döngüsüne entegre edebilirsiniz.

Hızlı arama, daha düşük düzeyli bir FUSE API'sini your own main loop yazmak için kullanabileceğinizi gösterir; bu da muhtemelen "döngü" bölümünü atlayarak daha kolay bir şekilde GLib'e entegre edilebilir. Genelde

olsa da, çoklu ana döngüler sadece kötü haber; Bu yüzden ana döngüler deniyorlar. :) Onları işlemenin en iyi yolu, olayları doğrudan sizin için en iyi olan şeyin içine sokarak onları ortadan kaldırmaktır. Ne yazık ki, tüm API'ler bunu mümkün kılmak için yeterli kanca sağlamaz.

+0

1 Bu muhtemelen bunu yapmanın en iyi mantıklı yoldur, ancak bazı eklemek istiyorum size 'linux kullanıyorsanız eventfd' veya' pipe' muhtemelen Glib ana döngü mesaj göndermek için iyi bir yol olacağını onlar neredeyse doğrudan glib ile kullanılabilecek dosya tanıtıcıları döndür. – Lalaland

+0

İyi nokta; hatta fork() 'ye tercih edilebilir ve çok iş parçacığıyla ilgili herhangi bir sorun yaşamadan FUSE (veya GLib) ana döngüsünü oradan çalıştırabilir. – ehird

+0

Teşekkürler Ethan. Korkarım ki, düşük seviyeli arayüze geçmek zorunda kalabilirim. Uzun bir gün olacak gibi görünüyor :) –

3

Ana döngüleri ayrı bir iş parçacığı veya bir işlem içinde kurmanın dışında (sahip olduğum küçük deneyimden, ayrı işlem benim için daha iyi çalıştı, ancak daha sonra iş parçacığınızda iş parçacığı işe yarayabilir) düşünebilirsiniz. sigorta ana döngüsünü GLib'in ana döngüsünde entegre etme (Ne yazık ki bu konuda daha önce hiç tecrübem yok). Aynı durum hakkında this thread discussion'u kontrol edebilirsiniz (zaten görmediyseniz). İpin " 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"'un sonunda önerildiği gibi. Fd'yi izlemek için GIO (More info on Nokia developer page) kullanmanız gerekecektir.
Umarım bu bazı ipuçları sağlayabilir! Sanırım

+0

Teşekkürler, bu da yararlıdır. –