不,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_send()
在其他线程完成设置循环和 uv_async 句柄之前调用。最新版本的 libuv 包括您可以使用的uv_barrier同步原语;但是 Node.js 0.8 附带的 libuv 版本尚不支持此功能,因此您可能需要使用 pthread 工具来完成此工作。
在旁注中,您似乎正在调用uv_ref
并uv_unref
使用循环引用作为参数。在最近的 libuv 版本中,这已经改变,你现在应该uv_ref
和uv_unref
一个特定的句柄。详见uv.h。 _