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