【问题标题】:libuv: uv_check_t and uv_prepare_t usagelibuv: uv_check_t 和 uv_prepare_t 用法
【发布时间】: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 - 所以当回调最终被调用时,我处理当前队列中的所有事件。

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

所以我希望能够尽可能频繁地检查事件队列——检查/准备观察者可以提供哪些,但在每次事件循环迭代时这样做(并锁定互斥体)可能有点过头了?

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

谢谢

【问题讨论】:

    标签: c++ node.js libuv


    【解决方案1】:

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

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

    【讨论】:

    • 你能提供一些使用 prepare 和 async 的示例代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多