Linux 如何将pthread_cond_timedwait与毫秒一起使用

Linux 如何将pthread_cond_timedwait与毫秒一起使用,linux,gcc,pthreads,Linux,Gcc,Pthreads,我试图使用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_

我试图使用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);

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;  

一边是秒和微秒,另一边是毫秒。结果以秒和纳秒为单位

如果尝试以纳秒表示秒,则可能会很快溢出:1秒=100000000纳秒,占用约30位。如果无符号(~2表示有符号整数),则无符号32位整数值最多可保存~4秒,并将溢出超过该值

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

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

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

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;

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

您能告诉线程睡眠的确切时间吗?超时发生了吗?超时发生了,睡眠时间总是超过我设置的毫秒数。互斥锁能占用额外的时间吗?谢谢,我已经经历了你说过的事情。让我试试。将让您知道。
ts.tv\u nsec+=30*1000000不是一个好的做法<代码>+=
将导致溢出。相反,应该使用
uint64\u t
进行时间添加。