4

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

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

根据libuv 的文档

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

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

4

2 回答 2

6

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

于 2015-11-20T17:55:06.977 回答
2

您也可以使用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);

我们甚至可以调用其他线程上的函数,并异步(和同步)收到结果通知。

于 2017-05-05T00:07:00.990 回答