【问题标题】:how to use pthread_cond_timedwait with millisecond如何以毫秒使用 pthread_cond_timedwait
【发布时间】:2013-06-18 10:05:38
【问题描述】:

我正在尝试将 pthread_cond_timedwait 用于毫秒睡眠间隔,但我没有获得睡眠持续时间。我的线程比我提到的睡得更多。下面是我的实现。让我知道我是否在任何地方错了。

    struct timeval tp;
    struct timespec ts;
    int rc = gettimeofday(&tp, NULL);

    ts.tv_sec = tp.tv_sec;
    ts.tv_nsec = tp.tv_usec * 1000;

    ts.tv_nsec += 30 * 1000000;  //30 is my milliseconds

    pthread_mutex_lock(&mtxPlaybackWait);
    pthread_cond_timedwait(&playbackSignal, &mtxPlaybackWait, &ts);
    pthread_mutex_unlock(&mtxPlaybackWait);

【问题讨论】:

  • 你能知道线程休眠的确切时间吗?是否发生超时?
  • 发生超时,睡眠时间总是超过我设置的毫秒数。互斥锁是否需要额外的时间?

标签: linux gcc pthreads


【解决方案1】:

timespac 可能会溢出并导致超时。
请尝试以下操作:

     ts.tv_sec = tp.tv_sec;
     ts.tv_nsec = tp.tv_usec * 1000;  

     ts.tv_nsec += 30 * 1000000; 

     ts.tv_sec += ts.tv_nsec / 1000000000L;  
     ts.tv_nsec = ts.tv_nsec % 1000000000L;  

【讨论】:

  • 谢谢,我经历了你所说的事情。让我尝试。会让你知道的。
  • ts.tv_nsec += 30 * 1000000; 不是一个好习惯。 += 会导致溢出。相反,应该使用uint64_t 来添加时间。
【解决方案2】:

您在一侧添加了秒和微秒,在另一侧添加了毫秒。结果以秒和纳秒为单位。

如果您尝试以纳秒为单位表示秒,这可能会很快溢出:1 秒 = 1,000,000,000 纳秒,占用约 30 位。一个无符号的 32 位整数值在无符号的情况下最多可以保存 ~4 秒(对于有符号的 int 为 ~2),并且会溢出。

另外,当传递一个小数秒数超过一秒的结构时,我不确定所有函数在所有情况下是否都能正常运行。我希望广泛使用的标准库首先完成他们的功课并规范化(或以其他方式确保正确的行为),但一些快速组装的利基产品可能无法正确处理此类情况。

为了防止异常的溢出和奇怪的副作用,尽可能减少整数秒并将它们存储在秒部分而不是小数秒中。

这是您的计算版本,它避免了这两种情况:

gettimeofday(&tp, NULL);
/* if msec is 1 s or more, add its integer part to tv_sec */
ts.tv_sec = tp.tv_sec + floor(msec / 1000);
/* for now, these are really µsec, not nsec, to prevent overflow */
ts.tv_nsec = tp.tv_usec + (msec % 1000) * 1000000;
/* if tv_nsec is 1s or more, move integer second part to tv_sec */
ts.tv_sec += floor(ts.tv_nsec / 1000000);
ts.tv_nsec %= 1000000;
/* and finally, convert µsec to nsec */
ts.tv_nsec *= 1000;

如果您确定您正在对整数类型(即msects.tv_nsec)进行操作,则您可能不需要floor - 在这种情况下,只需进行简单的除法即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多