gpt4 book ai didi

c++ - libuv: uv_check_t 和 uv_prepare_t 用法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:39 24 4
gpt4 key购买 nike

我一直在阅读 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com