5

我一直在阅读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- 所以当最终调用回调时,我会处理当前队列中的所有事件。

我对这种方法的担忧是,许多事件实际上可能会排队,直到触发回调并且可能同时失效(通过失效,我的意思是此时处理它们变得毫无意义)。

所以我希望能够尽可能频繁地检查事件队列 - 检查/准备观察者可以提供哪些,但在每次事件循环迭代时这样做(并锁定互斥体)可能是一种过度杀伤力?

而且,更重要的是,也许它们应该服务于一些更特殊的目的,而不仅仅是保护每次循环迭代一次的回调调用?

谢谢

4

1 回答 1

3

您可以使用准备句柄来检查队列中的事件,并使用异步句柄来唤醒循环。

如果你只使用一个准备句柄,你可能会陷入循环被 i/o 阻塞并且没有人会处理队列直到它完成轮询的情况。异步句柄将“唤醒”循环,下次准备句柄运行时,您将处理队列。

于 2014-09-24T12:55:47.847 回答