Linux下应用层定时器本来有好几种,大伙可以去搜索其他帖子博客,这里我主要描述我在使用setitimer时候遇到的问题,话不多说,直接上代码吧
例子一:只有定时器任务,为模拟复杂,我特意加个锁操作
// lock_timmer_test.cpp
1 | #include <iostream> |
编译:g++ lock_timmer_test.cpp 运行: ./a.out
运行结果证明:的确每隔timestep,回调函数就会被调用,执行特定任务
举例二:问题引申一下,我们把上述代码中main函数中的注释去掉,这时候会发生奇怪现象,整个程序会在回调调用的之后死锁,如图所示:
回调函数做的操作复杂后,可能由于调度问题或者是我自己代码没写好还是其他原因,在本例中,会出现死锁问题,查了相应的资料,有人建议回调函数不要太复杂,可能由于CPU调度问题和定时事件太短的而造成不确定因素。
所以在使用setitimer()的时候,我们尽量**不要让回调函数做过于复杂的操作,最好只是做某些标志位的置位操作就好。**
详情参见例四。
举例三:使用setitimer()定时器的时候,貌似不支持多个定时器的设置,详情看代码及运行结果,具体原因是什么,还请各位知道的指教指教。
1 | #include <iostream> |
运行结果:
从运行结果中可以看出,只有第二个定时器在运行,第一个被覆盖了,这对于我们想要同时设置两种定时器的需求,貌似得不到解决(知识点的局限,应该是我们代码有问题,还请大牛解答)。
所以针对需要设置多个定时器,我最后推荐使用select,或者使用libevent库中的定时器,具体参见例五,libevent的Timmer。
举例四:定时器回调函数只做标志位置位操作,另开一个线程,根据标志位做相应的操作。
1 | #include <iostream> |
运行结果:
从运行结果中可以看出: 定时器回调函数只做简单任务,复杂任务交由子线程处理,这样不会出什么问题。
举例五:使用libevent的Timmer(即select模式使用定时任务)
当需要多个定时任务同时定时操作的时候,因为本人暂时还没有找到setitimer的正确用法,因此不得不借用libevent的Timmer来实现,当然直接用select也可以,可以去搜索相应资料学习。
1 | #include <iostream> |
运行结果:
从最后结果中看,本人还是比较推荐使用libevent这种库,毕竟使用简单,功能强大。
ps:当然对于setitimer()来说,它支持延迟开启定时器,即itimerval 的 it_intercal 和it_value的含义,libevent对于相应的支持就需要各位自己动脑筋想办法了。(欢迎各位指教)