我有这样的设计问题。
两个事件A,B。
A将每3.2秒运行一次, B将每1.7秒运行一次,
我想使用usleep()来实现时序。我是否还应该分叉2个线程来同时计算时间? 或者,我只是睡了1.7秒,然后睡了1.5秒?然后继续??? 哪个更好?还有什么其他情况我应该考虑? 感谢。
答案 0 :(得分:3)
事件需要多长时间才能运行?如果它根本不是时间,那么在每个事件之间休眠将意味着事件不会每x
秒运行,其中x
是你睡觉的时间。例如,如果事件需要1.2秒而你睡眠为1.7,它将每2.9秒运行一次。所需时间的波动将使得很难确定每个事件何时运行。
您可以通过测量所花费的时间并从您想要等待的时间减去它(1.7 - 1.2 = 0.5
,让您睡眠0.5秒)或使用三个线程来抵消这一点:一个用于运行事件A,一个运行事件B,一个运行时间。您可以为事件完成时终止的每个事件创建一个线程,也可以让一个或多个永久线程接受要运行的作业。第一个选项意味着您不必担心并发(因为并发性很难)。
如果事件有可能比您等待的时间更长,则需要确保在上一次迭代仍在运行时再次启动事件A.如果你正在使用一个线程并且正在睡觉,那么这将为你照顾。如果确实沿着多线程的路线走下去,可以通过创建队列并将作业推到其上来避免这种情况,但是您需要确保不创建大量重复作业队列,您可以通过如果作业已经在队列中,或者为同一事件覆盖现有作业,则不排队作业(取决于以后的作业是否应该胜过之前的作业)。
答案 1 :(得分:3)
您可以使用Boosts asynchronous timers。在链接示例中,有两个计时器线程(一个是主线程)在设定周期同时运行,在这种情况下,以每秒一次的速率运行。要使它们分别在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));