gpt4 book ai didi

c++ - libuv线程安全吗?

转载 作者:IT老高 更新时间:2023-10-28 23:02:13 26 4
gpt4 key购买 nike

我创建了一个专门用于 libuv 运行循环的新线程。线程函数看起来像这样:

void thread_function()
{
uv_loop_t *loop = uv_loop_new();
uv_ref( loop );
uv_run( loop );
}

引用计数器增量使线程保持事件状态并处于处理 libuv 事件的状态。我希望能够通过在主线程上执行 uv_unref 来使运行循环结束,从而导致线程退出。

但是,在检查 uv_ref 源代码时,我没有看到任何保证在并发访问期间对引用计数器变量的访问会同步。此外,在运行循环期间,我没有看到任何让操作系统放弃控制权的 yield 调用,这意味着程序将无法与其他进程很好地协作。

这让我相信我没有以正确的方式使用 libuv。如果有人能解释我做错了什么,那就太好了!

最佳答案

不,libuv 以这种方式不是线程安全的。您应该使用 uv_async 来指示循环退出。 uv_async 是 libuv 唯一的线程安全工具。

看起来像这样:

uv_async_t exit_handle;

void exit_async_cb(uv_async_t* handle, int status) {
/* After closing the async handle, it will no longer keep the loop alive. */
uv_close((uv_handle_t*) &exit_handle, NULL);
}

void thread_function() {
uv_loop_t *loop = uv_loop_new();
/* The existence of the async handle will keep the loop alive. */
uv_async_init(loop, &exit_handle, exit_async_cb);
uv_run(loop);
}

现在,您可以从另一个线程发出信号,通过调用退出该循环

uv_async_send(&exit_handle);

您需要注意不要在其他线程完成设置循环和 uv_async 句柄之前调用 uv_async_send()。最新版本的 libuv 包括 uv_barrier您可以使用的同步原语;但 Node.js 0.8 附带的 libuv 版本尚不支持此功能,因此您可能需要使用 pthread 工具来完成此工作。

在旁注中,您似乎正在调用 uv_refuv_unref 以循环引用作为参数。在最近的 libuv 版本中,这已经改变,您现在应该为 uv_refuv_unref 一个特定的句柄。见 uv.h了解详情。

关于c++ - libuv线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13838972/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com