2012-12-12 25 views
13

Libuv çalıştırma döngüsüne adanmış yeni bir iş parçacığı oluşturdum. iplik işlevi şöyle görünür:Libuv vida dişi güvenli midir?

void thread_function() 
{ 
    uv_loop_t *loop = uv_loop_new(); 
    uv_ref(loop); 
    uv_run(loop); 
} 

ref sayacı artış hayatta iplik tutan ve olaylar libuv işlemek için bir devlet. Çalışma döngüsünün bitmesine ve böylece ana iş parçacığına uv_unref çalıştırılarak iş parçacığının çıkmasına neden olabilmeyi umuyorum. Ancak, uv_ref kaynak kodunun denetlenmesi sırasında, eşzamanlı erişim sırasında referans sayacı değişkenine erişimin senkronize edileceğine dair herhangi bir garanti göremedim. Ayrıca, çalışma döngüsü sırasında işletim sistemine denetimden vazgeçme yönünde herhangi bir getiri çağrısı görmedim, bu da programın diğer süreçlerle iyi bir işbirliği yapmayacağı anlamına geliyor. Bu, libuv'u doğru şekilde kullanmadığımı düşünmeme yol açıyor. Birisi yanlış yaptığımı açıklayabilirse, bu harika olurdu!

cevap

30

Hayır, libuv bu şekilde vida dişi değildir. Çıkmak için döngüye sinyal vermek için uv_async kullanmalısınız. uv_async, libuv'un sahip olduğu tek iş parçacığıdır.

Böyle görünecektir:

uv_async_t exit_handle; 

void exit_async_cb(uv_async_t* handle, int status) { 
    /* After closing the async handle, it will no longer keep the loop alive. */ 
    uv_close((uv_handle_t*) &exit_handle, NULL); 
} 

void thread_function() { 
    uv_loop_t *loop = uv_loop_new(); 
    /* The existence of the async handle will keep the loop alive. */ 
    uv_async_init(loop, &exit_handle, exit_async_cb); 
    uv_run(loop); 
} 

Şimdi çıkmak için bu döngüyü işaret edebilir, diğer iplikten

uv_async_send(&exit_handle); 

arayarak Daha önce uv_async_send() deme özen gerekiyor diğer iş parçacığı, döngüyü ve uv_async tutamacını ayarlamayı bitirdi. En son libuv sürümü, kullanabileceğiniz uv_barrier senkronizasyon temellerini içerir; ancak Node.js 0.8 ile birlikte gelen libuv sürümü bunu desteklemiyor, bu yüzden muhtemelen bu işi yapmak için pthread tesislerini kullanmanız gerekiyor.

Bir yan notda, uv_ref ve uv_unref numaralı çağrıları argüman olarak döngü referansı ile çağırıyor gibi görünüyorsunuz. Libuv'un son sürümlerinde bu değişti, şimdi uv_ref ve uv_unref'a özgü bir tutacağın var. Ayrıntılar için bkz. uv.h.

İlgili konular