使用 uv_close 而不是 uv_async_send 来一次性使用 uv_async 回调?

Using uv_close instead of uv_async_send for single use uv_async callbacks?

我的理解是uv_async单次使用的正确用法如下:

  1. 分配uv_async_t句柄;
  2. 在分配的句柄上调用 uv_async_init
  3. 致电uv_async_send安排回电;
  4. 注销句柄使用 uv_close;
  5. 删除关闭回调中的uv_async_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_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_close 不是线程安全的。

如果您只想在循环内安排一个回调,请选中 uv_idle_t。您还可以使用队列并根据需要启动/停止句柄,而不是创建和销毁。