【问题标题】:timer in a thread with pthread in C?C中带有pthread的线程中的计时器?
【发布时间】:2011-04-01 19:57:17
【问题描述】:

在线程中,我需要在不同的时间间隔内定期做一些工作,有什么好的方法可以做到这一点?使用 sleep(),然后我需要跟踪下一次唤醒的时间间隔,这似乎不是最好的方法。

谢谢。

【问题讨论】:

    标签: c pthreads


    【解决方案1】:

    您可以使用 clock_nanosleepTIMER_ABSTIME 标志来处理绝对时间而不是相对时间来进行睡眠。这将避免错误累积问题和竞争条件,即您的程序被中断以及在获取当前时间之后但在调用 sleep 之前安排另一个进程。

    或者,您可以将 POSIX 计时器 (timer_create) 与信号处理程序一起使用,其中您选择的信号在除您的线程之外的所有线程中被阻塞,或者在新线程中使用计时器传递来指示条件变量或信号量您的线程是等等。

    【讨论】:

    • 谢谢! clock_nanosleep 似乎是单个计时器的理想选择。但是我的线程对于不同的任务有不止一个不同的时间间隔。所以我会一直计算下一次唤醒时间。 timer_create 本来是一个不错的选择,但我有不止一种此类线程。
    • timer_create 有什么问题?你可以用它创建很多计时器,当我在我的系统上测试它时最多 32k...
    • 我以为有了定时器,信号会被传递到进程中任意选择的线程。可能是我记错了。
    • 这是真的,但是您可以安排所选信号在除一个线程之外的所有线程中被阻塞,或者您可以找到一种方法让信号处理程序通知正确的线程(尽管后者很难高效地完成,因为大多数可以做到这一点的功能都不是异步信号安全的)。
    • 好吧,我想我知道你的意思了。我可以让一个计时器线程保存一个排序的未来计时器任务列表,也可以在我的每个线程本地存储一个这样的列表。
    【解决方案2】:

    取决于您需要多少准确度:

    • 您可以使用clock_gettime,它非常准确(~10MHz)。 (使用实时或单调时钟)
    • 如果分辨率和开销不是问题,但您想获得真实世界的时间,您也可以gettimeofday

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      相关资源
      最近更新 更多