libuv线程安全吗?

我创build了一个专用于libuv运行循环的新线程。 线程函数看起来像这样:

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

引用计数递增保持线程活着并处于处理libuv事件的状态。 我希望能够导致运行循环结束,从而导致线程退出,在主线程上执行uv_unref

但是,在检查uv_ref源代码时,我没有看到任何保证在并发访问期间对引用计数器variables的访问将被同步。 另外,在运行循环期间,我没有看到任何yield yield调用来放弃对操作系统的控制,这意味着该程序不会与其他进程合作。

这导致我相信我没有以正确的方式使用libuv。 如果有人能解释我做错了什么,那会很棒!

不,libuv不是这样的线程安全的。 你应该使用uv_async来指示循环退出。 uv_async是libuv唯一的线程安全设施。

它看起来像这样:

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

现在从另一个线程可以通过调用来指示这个循环退出

 uv_async_send(&exit_handle); 

在另一个线程完成循环和uv_async句柄的设置之前,需要注意不要调用uv_async_send() 。 libuv的最新版本包括您可以使用的uv_barrier同步原语; 但是附带Node.js 0.8的libuv版本不支持这个function,所以你可能需要使用pthread工具来完成这个工作。

在旁注中,您似乎uv_unref以循环引用的forms调用uv_refuv_unref作为参数。 在最近版本的libuv中,这个已经改变了,你现在应该是uv_refuv_unref一个特定的句柄。 有关详细信息,请参阅uv.h。