void *worker(void *param) { while (!work_done) { read(g_workfds[0],work,sizeof(work)); do_work(work); } }
我需要在同一个线程中实现一个1秒的定时器来做一些关于工作的logging。 以下是我想到的:
void *worker(void *param) { prev_uptime = get_uptime(); while (!work_done) { // set g_workfds[0] as non-block Now_uptime = get_uptime(); if (Now_uptime - prev_uptime > 1) { do_book_keeping(); prev_uptime = Now_uptime; } n = poll(g_workfds[0],1000); // Wait for 1 second else timeout if (n == 0) // timed out continue; read(g_workfds[0],sizeof(work)); do_work(work); // This can take more than 1 second also } }
我正在使用系统正常运行时间而不是系统时间,因为在此线程运行时系统时间可能会更改。 我想知道是否还有其他更好的方法来做到这一点。 我不想考虑使用另一个线程。 使用alarm()不是一个选项,因为它已经被同一进程中的另一个线程使用。 这是在Linux环境中实现的。
计时初始化给出了任何指示?
Linux'hrtimer – 微秒精度?
是否有可能使用setitimerconfiguration3个以上的定时器?
如何提高Linux中1ms定时器的实时性能?
需要产生一个稳定的10mSec中断
信号问题,定时器(SIGEV_SIGNAL)
linux下1ms分辨率定时器推荐的方法
Linux中的HTimer(高分辨率定时器)
C Unix毫秒计时器返回0的差异
SetTimer(带callback函数)通过启动一个新的线程来工作吗?
我同意webbi在他的回答中写的大部分内容。 但是他的建议是利用时间而不是正常运行时间。 如果系统时间更新为“转发”,它将按预期工作。 但是如果系统时间回落了30秒,那么(Now_time – prev_time)将是负数(除非使用无符号类型,否则它将起作用),所以30秒内不会进行预约。
另一种方法是使用clock_gettime()和CLOCK_MONOTONIC作为clockid( http://linux.die.net/man/2/clock_gettime )。 如果你不需要比秒更小的时间单位有点杂乱。
我找到了一个更好的方法,但它是使用timerfd_create()系统调用的Linux特有的。 它考虑到系统时间变化。 以下是可能的伪代码:
void *worker(void *param) { int timerfd = timerfd_create(CLOCK_MONOTONIC,0); // Monotonic doesn't get affected by system time change // set timerfd to non-block timerfd_settime(timerfd,1 second timer); // timer starts while (!work_done) { // set g_workfds[0] as non-block n = poll(g_workfds[0] and timerfd,0); // poll on both pipe and timerfd and Wait indefinetly if (timerfd is readable) do_book_keeping(); if (g_workfds[0] is readable) { read(g_workfds[0],sizeof(work)); do_work(work); // This can take more than 1 second also } } }
看起来比较清晰,在timerfd上read() timerfd返回额外的时间, do_work()需要很长时间,这非常有用,因为do_book_keeping()期望每秒调用一次。
我发现你的代码中有些奇怪的东西…
poll()有3个参数,你传递2,第二个参数是你在第一个参数的struct数组中传递的结构的数目,第三个参数是超时。
参考: http : //linux.die.net/man/2/poll
除此之外,对于我来说,这样做是很好的,当然这不是最好的,但是没有其他的线程或者警告()等等,你可以使用时间而不是正常运行时间,如果系统日期改变,可能会导致一个错误,但是它会继续工作,因为它会被更新并持续等待1秒,不管什么时候。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。