c++ - libuv: uv_check_t 和 uv_prepare_t 用法

标签 c++ node.js libuv

我一直在阅读 The libuv book ,但是关于检查和准备观察者的部分是不完整的,所以我找到的唯一信息是在 uv.h 中:

/*
 * uv_prepare_t is a subclass of uv_handle_t.
 *
 * Every active prepare handle gets its callback called exactly once per loop
 * iteration, just before the system blocks to wait for completed i/o.
 */

/*
 * uv_check_t is a subclass of uv_handle_t.
 *
 * Every active check handle gets its callback called exactly once per loop
 * iteration, just after the system returns from blocking.
 */

我想知道 libuv 的 check and prepare watchers 有没有什么特殊用法

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

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


实际上,我当前的解决方案确实使用了 uv_async_t 观察器 - 每次我收到一个事件时,我都会将其放入队列中调用uv_async_send - 所以当最终调用回调时,我处理当前队列中的所有事件。

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

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

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

谢谢

最佳答案

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

如果您只使用一个准备句柄,您可能会遇到这样一种情况,即循环因 i/o 而被阻塞,并且在完成轮询之前没有人会处理队列。异步句柄将“唤醒”循环,下次准备句柄运行时,您将处理队列。

关于c++ - libuv: uv_check_t 和 uv_prepare_t 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130724/

相关文章:

c++ - 绑定(bind)返回值和可变参数模板

javascript - 使用 POST 方法时 Node.js req.body 为空

c++ - 调用某些回调函数两次导致段错误 : Nan

c - 如何使用 libuv 编译最小程序?

c++ - 在子矩阵上找到逐行最大值的最快方法

C++ 字符串格式化,如 Python "{}".format

c++ - 如何在编译时为DSL解析文本?

javascript - 简单的 Nodejs 正则表达式 : Extract text from between two strings

node.js - Node.js Web 应用程序上的 IBM Watson 语音到文本音频转换

c - libuv 和 uv_try_write : why multiple buffers?