首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libuv线程安全吗?

libuv线程安全吗?
EN

Stack Overflow用户
提问于 2012-12-12 19:41:15
回答 1查看 6.1K关注 0票数 16

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

代码语言:javascript
复制
void thread_function()
{
  uv_loop_t *loop = uv_loop_new();
  uv_ref( loop );
  uv_run( loop );
}

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-13 00:47:29

不,libuv在这种情况下不是线程安全的。您应该使用uv_async发出退出循环的信号。uv_async是libuv唯一的线程安全工具。

它看起来像这样:

代码语言:javascript
复制
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);
}

现在,在另一个线程中,您可以通过调用

代码语言:javascript
复制
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

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13838972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档