由于在C++中使用了异步IO,因此在不休眠的情况下延迟程序的其他方法



除了睡眠之外,我还有一个关于C++中延迟程序的其他方法的问题。

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

我遵循了这个sigaction的例子来实现这一点。我注意到,如果我在这个sigaction处于活动状态时尝试使用usleep,每当我收到数据包时,它就会打断我的睡眠。这是有道理的,因为我假设sigaction是由CPU上的某种中断触发的,这可能会使CPU停止睡眠。如果有人能很好地解释为什么会发生这种情况,我很想知道。我的问题是,有时我必须连续发送几个数据包,并且需要确保延迟它们,否则我的控制器会错过它们。

我通常会用睡眠来延迟数据包的发送,但现在我不能了,因为我的信号会破坏它。我曾考虑过可能使用忙等待,但这可能太不一致了。我也想过可能使用一个分组队列,该队列使用计时器定期清空,但似乎有一个更简单的解决方案。

除了睡觉之外,还有其他方法可以延迟数据包的发送吗?有没有一种方法可以设置我的异步IO,这样它就不会破坏睡眠?我是不是搞错了?

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

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

这应该澄清一些事情:

来自睡眠手册:

Return Value
Zero if the requested time has elapsed, or the number of seconds left to sleep, if the call was interrupted by a signal handler. 

一种选择是创建一个循环,检查时间是否已经过去(因为睡眠返回中断时剩余的秒数)。如果不只是执行另一个睡眠等等,直到所需时间结束。

最新更新