【问题标题】:Using uv_close instead of uv_async_send for single use uv_async callbacks?使用 uv_close 而不是 uv_async_send 进行单次使用 uv_async 回调?
【发布时间】:2017-01-06 04:54:00
【问题描述】:

我的理解是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);
    });

有其他人这样做吗,它被认为是安全的吗?

【问题讨论】:

    标签: c asynchronous libuv


    【解决方案1】:

    您要实现什么目标?你需要使用多个线程吗?如果是这样,那将不起作用,因为 uv_close 不是线程安全的。

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

    【讨论】:

    • 谢谢,这正是我需要的答案。虽然uv_async_send 是线程安全的,但我没有意识到uv_close 不是。因此,我依赖uv_close 回调的第二个版本的代码不是线程安全的,也不是第一版代码的有效替代品。在我的测试中,它可能完全是靠运气等待生产中爆发。
    猜你喜欢
    • 2017-02-25
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多