我一直在阅读The libuv book,但是关于检查和准备观察者的部分并不完整,所以我发现的唯一信息是在uv.h中:
/*
* uv_prepare_t是uv_handle_t的子类。
*
*每个事件的prepare句柄都会在每个循环中获得一次恰好被调用的回调
*迭代,就在系统阻塞等待完成的I/O之前。
*/
和
/*
* uv_check_t是uv_handle_t的子类。
*
*每个事件检查句柄都会在每个循环中恰好调用一次其回调
*迭代,就在系统从阻塞返回之后。
*/
我想知道libuv的检查和准备观察程序是否有特殊用途。
我正在将 native node.js绑定(bind)到c++库,该库需要处理从不同线程触发的事件,因此自然地,应从主线程调用回调。我尝试使用uv_async_t
,但是libuv不保证每个uv_async_send
都会调用一次回调,因此这对我不起作用。
这就是为什么我决定使用自己的线程安全事件队列,该事件队列要定期检查的原因。所以我想知道是否可以使用支票或准备观察程序来实现此目的。
实际上,我当前的解决方案确实使用了uv_async_t
观察程序-每次接收到事件时,我都会将其放入队列中并调用uv_async_send
-因此,当最终调用回调时,我将处理当前队列中的所有事件。
我对这种方法的担心是,实际上很多事件可能实际上一直排队,直到触发回调为止,并且同时可能变得无效(通过无效,我的意思是此时处理它们变得毫无意义)。
因此,我希望能够尽可能频繁地检查事件队列-可以提供哪些检查/准备观察者,但在每次事件循环迭代中执行此操作(并锁定互斥体)可能会为时过晚?
而且,更重要的是,也许应该被用于某些特殊目的,而不仅仅是确保每个循环迭代一次的回调调用?
谢谢
最佳答案
您可以使用准备句柄检查事件队列,并使用异步句柄唤醒循环。
如果仅使用准备句柄,则可能会陷入循环被I/O阻塞而没有人处理队列直到完成轮询的情况。异步句柄将“唤醒”循环,下一次准备句柄运行时,您将处理队列。
关于c++ - libuv:uv_check_t和uv_prepare_t用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18130724/