我有一个奇怪的问题。我有以下代码:
dbg("condwait: timeout = %d, %d\n",
abs_timeout->tv_sec, abs_timeout->tv_nsec);
ret = pthread_cond_timedwait( &q->q_cond, &q->q_mtx, abs_timeout );
if (ret == ETIMEDOUT)
{
dbg("cond timed out\n");
return -ETIMEDOUT;
}
dbg
在每一行之前调用gettimeofday
并在该行前面加上时间。它导致以下输出:
7.991151: condwait: timeout = 5, 705032704
7.991158: cond timed out
如您所见,两条调试线之间只传递了 7 微秒,但pthread_cond_timedwait
返回了ETIMEDOUT
. 这怎么可能发生?我什至尝试在初始化 cond 变量时将时钟设置为其他值:
int ret;
ret = pthread_condattr_init(&attributes);
if (ret != 0) printf("CONDATTR INIT FAILED: %d\n", ret);
ret = pthread_condattr_setclock(&attributes, CLOCK_REALTIME);
if (ret != 0) printf("SETCLOCK FAILED: %d\n", ret);
ret = pthread_cond_init( &q->q_cond, &attributes );
if (ret != 0) printf("COND INIT FAILED: %d\n", ret);
(没有打印出任何错误消息)。我都试过了CLOCK_REALTIME
和CLOCK_MONOTONIC
。
此代码是阻塞队列的一部分。我需要这样的功能,如果在 5 秒内没有任何东西放在这个队列上,就会发生其他事情。互斥体和条件都被初始化,因为如果我不使用阻塞队列工作正常pthread_cond_timedwait
。