首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libuv线程通信

libuv线程通信
EN

Stack Overflow用户
提问于 2015-11-15 15:15:22
回答 2查看 2.4K关注 1票数 4

我有一个c++库,客户端应用程序使用这个库从服务器查询数据。这个库创建一个独立的线程来与服务器通信,查询结果将作为回调函数中的参数传递。

现在我想将这个c++库包装到nodejs本机模块,因为回调函数是在这个库的线程中调用的,为了将查询结果传递给js环境,我认为必须使用libuv的uv_async_send(uv_async_t*异步)方法在两个线程之间传递数据。

根据利布夫氏病

警告: libuv将合并对uv_async_send()的调用,也就是说,对它的每个调用都不会产生回调的执行。例如:如果在调用回调之前在一行中调用uv_async_send() 5次,则回调将只被调用一次。如果在调用回调之后再次调用uv_async_send(),则将再次调用它。

此警告是否意味着uv_async_send可能导致数据丢失?我想知道libuv是否为这个问题提供了一个更好的解决方案,还是我应该使用其他的头图书。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-20 17:55:06

您是正确的- uv_async_send是唤醒主线程的正确方法。我建议您每次调用uv_async_send时,都应该在队列、向量或其他容器中积累回调的相关数据。正如文档所提到的,uv_async_send()调用将合并,回调事件将至少唤醒主线程一次。为了确保所有回调数据都已传递,您需要将其存储在队列或向量的某个位置,以便c++回调代码能够将其全部传递。

票数 6
EN

Stack Overflow用户

发布于 2017-05-05 00:07:00

您也可以使用回调

它使用队列处理非合并调用。

在接收线程中:

代码语言:javascript
复制
uv_callback_t send_data;

void * on_data(uv_callback_t *handle, void *data) {
  do_something(data);
  free(data);
}

uv_callback_init(loop, &send_data, on_data, UV_DEFAULT);

在发件人线程中:

代码语言:javascript
复制
uv_callback_fire(&send_data, data, NULL);

我们甚至可以在其他线程上调用函数,并以异步方式(并以同步方式)通知结果。

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

https://stackoverflow.com/questions/33721277

复制
相关文章

相似问题

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