gpt4 book ai didi

c++ - pthread_cond_timedwait 立即返回 ETIMEDOUT

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:31 25 4
gpt4 key购买 nike

我正在尝试使用 pthread_cond_timedwait 来等待超时,类似于 Java 的 wait(long timeout, int nanos)。我知道 Java 的 wait 使用相对超时,而 pthread_cond_timedwait 使用绝对时间阈值。尽管考虑到了这一点,pthread_cond_timedwait 似乎会立即返回并返回错误代码 ETIMEDOUT。

下面的示例程序打印出一个值<0。我希望它打印一个 >=0 的值。

我是否错误地使用了 pthread_cond_timedwait?我将如何重写下面的程序以添加例如延迟5 秒?

#define _POSIX_C_SOURCE 199309L

#include <stdio.h>
#include <pthread.h>
#include <time.h>
#include <errno.h>

int main(void) {
pthread_mutex_t mutex;
pthread_cond_t cond;

pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond, NULL);

pthread_mutex_lock(&mutex);

struct timespec t1;
struct timespec t2;

clock_gettime(CLOCK_MONOTONIC, &t1);

t1.tv_sec += 5;

while(pthread_cond_timedwait(&cond, &mutex, &t1) != ETIMEDOUT);

clock_gettime(CLOCK_MONOTONIC, &t2);

printf("%d", t2.tv_sec - t1.tv_sec);

pthread_mutex_unlock(&mutex);

pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);

return 0;
}

最佳答案

你用错了时钟。 pthread_cond_timedwait 使用的默认时钟是 CLOCK_REALTIME。如果您真的想改用CLOCK_MONOTONIC,则需要设置条件变量的时钟属性:

pthread_condattr_t condattr;
pthread_condattr_init(&condattr);
pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
pthread_cond_init(&cond, &condattr);

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

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