使用 uv_close 而不是 uv_async_send 来一次性使用 uv_async 回调?
Using uv_close instead of uv_async_send for single use uv_async callbacks?
我的理解是uv_async
单次使用的正确用法如下:
- 分配
uv_async_t
句柄;
- 在分配的句柄上调用
uv_async_init
;
- 致电
uv_async_send
安排回电;
- 注销句柄使用
uv_close
;
- 删除关闭回调中的
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
。您还可以使用队列并根据需要启动/停止句柄,而不是创建和销毁。
我的理解是uv_async
单次使用的正确用法如下:
- 分配
uv_async_t
句柄; - 在分配的句柄上调用
uv_async_init
; - 致电
uv_async_send
安排回电; - 注销句柄使用
uv_close
; - 删除关闭回调中的
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
。您还可以使用队列并根据需要启动/停止句柄,而不是创建和销毁。