libuv线程通信

4
我有一个C++库,客户端应用程序使用这个库从服务器查询数据。该库创建一个单独的线程与服务器通信,查询结果将作为参数传递给回调函数。
现在我想将这个C++库包装成Node.js本地模块,由于回调函数是在该库自己的线程中调用的,为了将查询结果传递到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是否提供了更好的解决方案,或者我应该使用其他线程库。
2个回答

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

您的建议是正确的,非常感谢您的帮助! - forrest

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接