libuv线程通信

时间:2015-11-15 15:15:23

标签: c++ node.js multithreading libuv node.js-addon

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

现在我想将这个c ++ lib包装到nodejs本机模块,因为在这个lib自己的线程中调用了回调函数,为了将查询结果传递给js环境,我相信我必须使用libuv的uv_async_send(uv_async_t * async)在两个线程之间传递数据的方法。(如果我错了,请纠正我)

根据libuv's doc

  

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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:0)

您也可以使用uv_callback

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

在接收者线程中:

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);

在发件人帖子中:

uv_callback_fire(&send_data, data, NULL);

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