Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
libuv线程通信 我有C++ lib,客户端应用程序使用这个lib从服务器查询数据。该库创建一个单独的线程与服务器通信,查询结果将作为参数在回调函数中传递_C++_Node.js_Multithreading_Libuv_Node.js Addon - Fatal编程技术网

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

libuv线程通信 我有C++ lib,客户端应用程序使用这个lib从服务器查询数据。该库创建一个单独的线程与服务器通信,查询结果将作为参数在回调函数中传递,c++,node.js,multithreading,libuv,node.js-addon,C++,Node.js,Multithreading,Libuv,Node.js Addon,现在我想把这个C++的LIB打包到NoDEJS原生模块,因为在这个LIB自己的线程中调用了回调函数,为了把查询结果传递给JS环境,我相信我必须使用LIHBV的UVY-AsYNcCySead(UVYAssicCyt*Asic)方法来在两个线程之间传递数据。(如果我错了,请纠正我) 根据: 警告:libuv将合并对uv_async_send()的调用,也就是说,不是每个对它的调用都会产生回调的执行。例如:如果在调用回调之前一行调用了5次uv_async_send(),那么回调将只调用一次。如果在调用

现在我想把这个C++的LIB打包到NoDEJS原生模块,因为在这个LIB自己的线程中调用了回调函数,为了把查询结果传递给JS环境,我相信我必须使用LIHBV的UVY-AsYNcCySead(UVYAssicCyt*Asic)方法来在两个线程之间传递数据。(如果我错了,请纠正我)

根据:

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


此警告是否意味着uv\u async\u send可能导致数据丢失?我想知道libuv是否能为这个问题提供更好的解决方案,还是应该使用其他thead库

你是正确的-
uv\u async\u send
是唤醒主线程的正确方法。我建议每次调用
uv\u async\u send
,都将回调的相关数据累积到队列、向量或其他容器中。正如文档中提到的,uv_async_send()调用将合并,回调事件将至少唤醒主线程一次。为了确保所有的回调数据都被传递,您将希望将它存储在队列或向量中的某个地方,以便C++回调代码可以将其全部传递。 它使用队列处理非合并调用

在接收器线程中:

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);
在发送者线程中:

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

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

您的建议是正确的,谢谢您的帮助!