libuv线程通信
libuv thread communication
我有一个c++库,客户端应用程序使用这个库从服务器查询数据。这个库创建了一个单独的线程来与服务器通信,查询结果将作为回调函数中的参数传递。
现在我想把这个c++库包装到nodejs本机模块中,因为回调函数是在这个库自己的线程中调用的,为了将查询结果传递给js环境,我认为我必须使用libuv的uv_async_send(uv_async_t*async)方法在两个线程之间传递数据。(如果我错了,请纠正我)
根据libuv的文档:
警告:libuv将合并对uv_async_send()的调用,也就是说,并不是每个对它的调用都会产生回调的执行。例如:如果在调用回调之前连续调用uv_async_send()5次,则回调将只调用一次。如果在调用回调之后再次调用uv_async_send(),则会再次调用它。
此警告是否意味着uv_async_send可能导致数据丢失?我想知道libuv是否为这个问题提供了更好的解决方案,或者我应该使用其他的数据库。
您是正确的-uv_async_send
是唤醒主线程的正确方式。我建议每次调用uv_async_send
时,将回调的相关数据累积到队列、向量或其他容器中。正如文档中提到的,uv_async_send()调用将合并,回调事件将至少唤醒主线程一次。为了确保所有回调数据都已传递,您需要将其存储在队列或向量中的某个位置,以便您的c++回调代码能够传递所有数据。
您还可以使用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);
我们甚至可以调用其他线程上的函数,并异步(和同步)收到结果通知。
相关文章:
- C++一个线程如何正确通信其任务已完成?
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- 线程之间的通信不起作用 - C++
- 关于套接字通信的线程
- ZeroMQ:如何使用inproc减少多线程通信延迟
- 用于线程间通信的 Windows 套接字
- 与处理 ZeroMQ 的永久线程与 Qt 通信
- 与非主线程的 GUI 线程通信
- 使用 C++14 和 GLib (GDBus) 的线程通信
- 使用Protobuf进行线程通信
- C 14中的乘数交叉线程通信
- 串口读取功能的通信超时和线程不超时
- 使用PTHREDS与C 进行线程通信
- Qt中的多线程通信
- 远程、IPC 和线程场景中微服务的低延迟通信
- C++ - 多线程 - 线程之间的通信
- 线程中的通信丢失
- 与OpenSSL的多线程通信
- main()和线程()之间的通信
- Qt多线程通信