由于在C+;中使用异步IO,因此可以在不睡眠的情况下延迟程序+;? 我有一个问题,除了在睡觉之外,还有一种延迟C++程序的方法。< /P>

由于在C+;中使用异步IO,因此可以在不睡眠的情况下延迟程序+;? 我有一个问题,除了在睡觉之外,还有一种延迟C++程序的方法。< /P>,c++,asynchronous,sleep,usleep,C++,Asynchronous,Sleep,Usleep,我的程序中有一部分接收UDP数据包并将其发送到控制器。程序的这一部分必须异步运行。为了减少这个提供者的开销,我决定使用异步IO来接收UDP数据包,而不是使用单独的线程来监视套接字 我遵循一个SIGATION的例子来实现这一点。我注意到,如果我在这个sigaction处于活动状态时尝试使用usleep,每当我收到一个数据包时,它就会打断我的睡眠。这是有意义的,因为我假设sigaction是由CPU上的某种中断触发的,这种中断可能会阻止CPU睡眠。如果有人能很好地解释为什么会发生这种情况,我很想知道

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

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

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


除了睡觉,还有没有其他方法延迟发送数据包?有没有办法设置我的异步IO,使它不会中断睡眠?我这样做是错误的吗?

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


我个人很喜欢libev,尽管我也听到了libev的好消息。

这应该可以澄清一些事情:

从睡眠手册:

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. 

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

如果您发现需要睡眠直到异步操作完成,那么您根本就没有异步的用处。我应该澄清的是,只有接收是异步完成的。每当我在主进程中调用发送数据包时,发送就完成了。问题是异步操作会中断初始化线程中的所有休眠。感谢您的输入。我想你是对的,我可能应该转向一种更为事件驱动的结构。我真的不应该用睡眠来控制流量。谢谢你的链接,我将查看libevent。这是一个非常好的主意,我忘了它返回了一个值。编辑:实际上我使用usleep是因为我需要毫秒精度,它只返回-1或0,(),但是谢谢你的建议!因此,您可以尝试nanosleep(手动):如果调用被信号处理程序中断,nanosleep()将返回-1,将errno设置为EINTR,并将剩余时间写入rem指向的结构中,除非rem为NULL。然后可以使用*rem的值再次调用nanosleep(),并完成指定的暂停(但请参见注释)。