tv_sec, abs_timeout-6ren">
gpt4 book ai didi

c - pthread_cond_timedwait 立即返回

转载 作者:太空狗 更新时间:2023-10-29 17:04:57 30 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。我有以下代码:

    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_REALTIMECLOCK_MONOTONIC

此代码是阻塞队列的一部分。我需要这样的功能,如果 5 秒内没有任何东西被放入这个队列,就会发生其他事情。 mutex 和 cond 都已初始化,因为如果我不使用 pthread_cond_timedwait,阻塞队列工作正常。

最佳答案

pthread_cond_timedwait 需要一个绝对时间,而不是一个相对时间。您需要通过将当前时间加到您的超时值来使您的等待时间成为绝对时间。

关于c - pthread_cond_timedwait 立即返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/660916/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com