我一直在阅读The libuv book,但是关于检查和准备观察者的部分不完整,所以我发现的唯一信息是在 uv.h 中:
/* * uv_prepare_t 是 uv_handle_t 的子类。 * * 每个活动的准备句柄都会在每个循环中调用一次它的回调 * 迭代,就在系统阻塞等待完成的 i/o 之前。 */
和
/* * uv_check_t 是 uv_handle_t 的子类。 * * 每个活动的检查句柄都会在每个循环中调用一次其回调 * 迭代,就在系统从阻塞状态返回之后。 */
我想知道libuv的检查和准备观察者是否有任何特殊用途。
我正在编写一个本地 node.js 绑定到一个需要处理从不同线程触发的事件的 c++ 库,所以自然地,应该从主线程调用回调。我尝试使用uv_async_t
,但是 libuv 不保证每次都会调用一次回调,uv_async_send
所以这对我不起作用。
这就是为什么我决定使用我自己的线程安全事件队列,我想定期检查它。所以我想知道为此目的是否可以使用检查或准备观察者。
实际上,我当前的解决方案确实使用了一个uv_async_t
观察者 - 每次我收到一个事件时,我都会将它放入队列并调用uv_async_send
- 所以当最终调用回调时,我会处理当前队列中的所有事件。
我对这种方法的担忧是,许多事件实际上可能会排队,直到触发回调并且可能同时失效(通过失效,我的意思是此时处理它们变得毫无意义)。
所以我希望能够尽可能频繁地检查事件队列 - 检查/准备观察者可以提供哪些,但在每次事件循环迭代时这样做(并锁定互斥体)可能是一种过度杀伤力?
而且,更重要的是,也许它们应该服务于一些更特殊的目的,而不仅仅是保护每次循环迭代一次的回调调用?
谢谢