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
    回调的第二个版本的代码不是线程安全的,也不是第一个版本代码的有效替代品。在我的测试中,它可能是出于纯粹的运气,等待在生产中爆炸。