我有一个关于除了睡眠以外延迟C ++程序的替代方法的问题。
我的程序中有一部分可以接收UDP数据包并将其发送到控制器。程序的这一部分必须异步运行。为了减少此提供程序的开销,我决定使用异步IO来接收UDP数据包,而不是使用单独的线程监视套接字。
我遵循了此举动的示例来完成此任务。我注意到,如果在此活动处于活动状态时尝试使用usleep,则每当收到数据包时,它都会中断我的睡眠。之所以这样说是有道理的,因为我认为该触发是由CPU上的某种中断触发的,这可能会阻止CPU进入睡眠状态。如果有人能很好地解释为什么会发生这种情况,我很想知道。我的问题是,有时候我必须连续发送几个数据包,并且需要确保延迟它们,否则它们将被我的控制器遗漏。
我通常会用睡眠来延迟数据包的发送,但是现在我不能,因为它被我的签名破坏了。我曾考虑过可能要使用繁忙的等待时间,但这可能太不一致了。我也可能会使用一个使用计时器定期清空的数据包队列,但是似乎有一个更简单的解决方案。
除了睡眠以外,还有其他方法可以延迟发送数据包吗?有没有一种方法可以设置我的异步IO,这样就不会破坏睡眠状态?我会以错误的方式处理吗?
通常,在编写异步程序时,您会切换到事件循环风格的编程。任何事件系统都将使您能够设置触发回调的计时器,并使用这些计时器可以设置发送流量和诸如此类的时间表。另外,您通常使用它们来监视套接字,并在需要读取内容时简单地调用回调。虽然对于UDP并不重要,但是如果您随时都在处理TCP,那么您还想在准备好将套接字写入套接字时使用它们来调用回调,这样一来,您就不会在尝试写出数据时阻塞进程。
我个人喜欢http://libevent.org/,尽管我也听说过libev的好处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句