libuv:uv_check_t和uv_prepare_t用法

我一直在阅读libuv书 ,但检查和准备观察的部分是不完整的,所以我发现的唯一信息是在uv.h:

 / *
  * uv_prepare_t是uv_handle_t的子类。
  *
  *每个活动的准备句柄在每个循环中只调用一次
  *迭代,就在系统阻塞之前等待完成的I / O。
  * /

 / *
  * uv_check_t是uv_handle_t的子类。
  *
  *每个活动的检查句柄在每个循环中调用一次
  *迭代,在系统从阻塞返回之后。
  * /

我想知道是否有任何libuv的检查和准备看守人的特殊用法。

我正在编写一个本地node.js绑定到一个c ++库,需要处理从不同线程触发的事件,所以自然,应该从主线程调用callback。 我尝试使用uv_async_t ,但是libuv不保证每一个uv_async_send调用一次callback,所以这对我不起作用。

这就是为什么我决定去我自己的线程安全的事件队列,我想定期检查。 所以我想知道是否使用支票或准备观察员可以为此目的。


实际上,我当前的解决scheme确实使用了uv_async_t监视器 – 每当我收到一个事件,我就把它放在队列中, 调用uv_async_send – 所以当最后调用callback函数时,我会处理当前队列中的所有事件。

我对这种方法的担心是,许多事件可能实际上排队等待,直到callback被触发,同时可能失效(通过无效,我的意思是在这一点上处理它们变得毫无意义)。

所以我希望能够尽可能频繁地检查事件队列 – 观察者可以提供哪些检查/准备, 但是在每个事件循环迭代中,这样做可能是矫枉过正的(并且locking一个互斥锁)?

而且,更重要的是, 也许他们应该服务于更多的特殊用途,而不仅仅是确保一次循环迭代callback调用?

谢谢

你可以使用一个准备句柄来检查你的队列中的事件,以及一个asynchronous句柄来唤醒循环。

如果只使用一个准备句柄,则可以在循环被I / O阻塞的情况下进入,没有人会处理队列,直到完成轮询。 asynchronous句柄会“唤醒”循环,下次准备句柄时,你会处理队列。