C 对于单次使用的uv\U异步回调,是否使用uv\U关闭而不是uv\U异步\U发送?
我的理解是,C 对于单次使用的uv\U异步回调,是否使用uv\U关闭而不是uv\U异步\U发送?,c,asynchronous,libuv,C,Asynchronous,Libuv,我的理解是,uv\u async单次使用的正确用法如下: 分配uv\u async\t句柄 在分配的句柄上调用uv\u async\u init 调用uv\u async\u send来安排回调 使用uv_close注销句柄 删除关闭回调中的uv\u async\u t句柄 例如: uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t)); uv_async_init(&uvLoop, handle, [](
uv\u async
单次使用的正确用法如下:
uv\u async\t
句柄李>
uv\u async\u init
李>
uv\u async\u send
来安排回调李>
uv_close
注销句柄李>
uv\u async\u t
句柄李>
例如:
uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t));
uv_async_init(&uvLoop, handle, [](uv_async_t *handle) {
// My async callback here
uv_close((uv_handle_t*)handle, [](uv_handle_t* handle) {
free(handle);
});
});
uv_async_send(&asyncCb->uvAsync);
根据我收集的信息,uv\u close
在uvLoop中异步调用。因此,我尝试执行以下操作以避免在事件循环中将两个回调排队:
uv_async_t *handle = (uv_async_t*)malloc(sizeof(uv_async_t));
uv_async_init(&uvLoop, handle, nullptr);
uv_close((uv_handle_t*)handle, [](uv_handle_t* handle) {
// My async callback here
free(handle);
});
还有其他人这样做吗?这被认为是安全的吗?你想要实现的目标是什么?您需要使用多个线程吗?如果是这样,那就不起作用了,因为
uv\u close
不是线程安全的
如果您只想在循环中安排将来的回调,请选中
uv\u idle\t
。您还可以使用队列,根据需要启动/停止句柄,而不是创建和销毁句柄。谢谢,这正是我需要的答案。虽然uv\u async\u send
是线程安全的,但我没有意识到uv\u close
不是。因此,我依赖于uv_close
回调的第二个版本的代码不是线程安全的,也不是第一个版本代码的有效替代品。在我的测试中,它可能是出于纯粹的运气,等待在生产中爆炸。