C / C ++时钟计时问题

我有这样的devise问题。

两个事件A,B

A每3.2秒运行一次,B每1.7秒运行一次,

我想用usleep()来实现时间。 而且我应该同时叉2线程计数时间吗? 或者,我只是吃了1.7个百分点,然后睡了1.5秒? 并继续? 哪个更好? 还有什么其他的情况我应该考虑? 谢谢。

事件需要多久才能运行? 如果没有多少时间,在每个人之间进行睡眠意味着事件不会每隔x秒运行一次,其中x是你睡觉的时间。 例如,如果事件需要1.2秒,而您的睡眠时间为1.7秒,则会每2.9秒运行一次。 所花时间的波动会使得很难确定每个事件的运行时间。

您可以通过测量所需时间并从您想要等待的时间( 1.7 - 1.2 = 0.5 ,让您睡眠0.5秒)中减去它,或者使用三个线程来抵消:一个运行事件A,一个运行事件B和一个做时机。 您可以为事件完成时终止的每个事件创建线程,也可以让一个或多个接受作业的永久线程运行。 第一个选项意味着你不必担心并发(因为并发是困难的)。

如果事件发生的可能性比等待的时间长,则需要确保在前一次迭代中仍然运行时不再启动事件A. 如果你正在使用一个线程和睡觉,这将被照顾你。 如果你走了多条线程的路线,你可以通过创建一个队列并将作业推送到它上面来避免这种情况,但是你需要确保你不会创建一个大量的重复作业队列,你可以通过如果已经在队列中,则不排队作业,或者覆盖同一事件的现有作业(取决于后面的作业是否应该胜过先前的作业)。

您可以使用Boosts异步计时器 。 在链接的例子中,有两个定时器线程(一个是主线程)在一个设定的时间段内同时运行,在这种情况下,以每秒一次的速度运行。 为了使它们分别在3.2和1.7秒运行,改变这样的行:

 timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1)); 

使其每3.2秒运行一次:

 timer1_.expires_at(timer1_.expires_at() + boost::posix_time::millisec(3200));