我需要一个线程在我的过程中每5ms(精确)唤醒并做一些工作 我使用了posix定时器,它们似乎准确率为90%,当cpu有点负载时,准确度会进一步降低 我相信这是因为posix计时器必须在每个到期时分叉新线程 还有其他一些可靠的方法在linux中实现高分辨率计时器并且会增加线程帮助的优先级吗? 我在CentOS 5.6上。
答案 0 :(得分:6)
POSIX计时器(使用timer_create()
创建)已经是高分辨率。您的问题在于交付方式 - 如果您想要非常精确的时间安排,那么SIGEV_THREAD
不是一个好主意。
您可以改为使用SIGEV_SIGNAL
,以便通过信号通知计时器到期,然后使用sigwaitinfo()
等待它过期。或者,您可以使用timerfd而不是POSIX计时器(使用timerfd_create()
创建)。
此外,如果您希望线程在计时器到期时抢占其他正在运行的线程,则需要为其提供{{1, }}
您还需要确保使用SCHED_FIFO
选项编译内核,该选项允许大多数内核代码可抢占。由于不可抢占的内核工作(如硬件中断和softirq)会导致一定程度的抖动。为了进一步减少这种情况,您可以尝试使用CONFIG_PREEMPT_RT
kernel patchset。