我正在尝试将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);
答案 0 :(得分:0)
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 :(得分:0)
一方面增加了秒和微秒,另一方面增加了毫秒。结果以秒和纳秒为单位。
如果您尝试以纳秒表示秒,这可能会很快溢出:1 秒 = 1,000,000,000 纳秒,占用约 30 位。一个无符号的 32 位整数值如果是无符号的(对于有符号整数为 ~2),则最多可以保持约 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;
如果您确定要对整数类型(即 floor
和 msec
)进行运算,则可能不需要 ts.tv_nsec
——在这种情况下,一个简单的除法就可以了。< /p>