gpt4 book ai didi

c++ - 由于在 C++ 中使用异步 IO 而延迟我的程序而不休眠的替代方法?

转载 作者:太空狗 更新时间:2023-10-29 20:24:49 25 4
gpt4 key购买 nike

我有一个关于在 C++ 中除了 sleep 之外延迟程序的替代方法的问题。

我有一部分程序接收 UDP 数据包并将其发送到 Controller 。这部分程序必须异步运行。为了减少此提供程序的开销,我决定使用异步 IO 来接收 UDP 数据包,而不是让单独的线程监视套接字。

我关注了this完成此操作的 sigaction 示例。我注意到,如果我在这个 sigaction 处于事件状态时尝试使用 usleep,它会在我收到数据包时中断我的 sleep 。这是有道理的,因为我假设 sigaction 是由 CPU 上的某种中断触发的,这可能会阻止 CPU 休眠。如果有人对为什么会发生这种情况有很好的解释,我很想知道。我的问题是,有时我必须连续发送多个数据包,并且需要确保延迟它们,否则它们会被我的 Controller 遗漏。

我通常会使用 sleep 来延迟数据包的发送,但现在我不能,因为它被我的 sigaction 破坏了。我考虑过也许使用繁忙的等待,但它可能太不一致了。我也考虑过使用计时器定期清空的数据包队列,但似乎可能有更简单的解决方案。

除了休眠之外,还有其他方法可以延迟数据包的发送吗?有没有办法设置我的异步 IO,这样它就不会中断 sleep ?我是不是以错误的方式解决了这个问题?

最佳答案

通常在编写异步程序时,您会切换到事件循环编程风格。任何事件系统都会让您能够设置触发回调的计时器,使用那些您可以设置发送流量和类似事情的时间表。此外,您通常使用它们来监视您的套接字,并在有内容需要读取时简单地调用您的回调。虽然对 UDP 不重要,但如果您在任何时候处理 TCP,您还想在套接字准备好写入时使用它们调用回调,这样您就不会在尝试写出数据时阻塞您的进程.

我个人喜欢http://libevent.org/尽管我也听说过 libev 的好消息。

关于c++ - 由于在 C++ 中使用异步 IO 而延迟我的程序而不休眠的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167272/

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