369_C++_pthread_cond_timedwait 超时阻塞,必须先初始化绑定CLOCK_MONOTONIC 一下,显式设置时钟类型才能使得超时阻塞生效

在使用 pthread_cond_timedwait 进行超时阻塞时,条件变量的 pthread_condattr_t 属性中指定时钟类型是非常重要的。默认情况下,pthread_cond_timedwait 使用 CLOCK_REALTIME 作为时钟来计算超时。然而,如果你希望使用 CLOCK_MONOTONIC 作为时钟源(以避免系统时间变化引起的问题),则需要显式地设置时钟类型为 CLOCK_MONOTONIC

1. 为什么需要初始化 CLOCK_MONOTONIC

pthread_cond_timedwait 的第三个参数是一个 timespec 结构体,用于指定超时的绝对时间。默认情况下,pthread_cond_timedwait 使用 CLOCK_REALTIME 作为时钟源,这意味着超时会根据系统的实时时间(即当前时间)来计算。而如果系统时间发生跳变(例如,NTP 校时或手动修改系统时间),可能会影响计算出的超时时间,导致超时行为不符合预期。

为了避免这种问题,可以使用 CLOCK_MONOTONIC,该时钟是单调递增的,不受系统时间的影响。CLOCK_MONOTONIC 的时间是从系统启动时开始计算的,不会被系统时间的变化(如调整或同步)所影响,因此非常适合用于超

`CLOCK_MONOTONIC` 并不是一个头文件,而是一个时钟标识符,在 POSIX 兼容系统上用于获取单调递增的时间值。它通常通过 `clock_gettime()` 函数来访问。 ### 什么是 `CLOCK_MONOTONIC` `CLOCK_MONOTONIC` 表示一个从某个任意固定时间点开始计数的时钟,并且这个时钟不会受到系统时间调整的影响(例如通过 NTP 同步)。因此它是单调递增的,意味着它只会前进,绝不会倒退或突然跳跃。这对于测量经过的时间非常有用,特别是在需要高精度定时的应用场景下。 要在程序中使用 `CLOCK_MONOTONIC`,你需要包含 `<time.h>` 头文件并链接实时库 (`-lrt`): ```c #include <stdio.h> #include <time.h> int main() { struct timespec ts; // 获取当前的 CLOCK_MONOTONIC 时间 if (clock_gettime(CLOCK_MONOTONIC, &ts) == -1) { perror("clock_gettime"); return 1; } printf("Current monotonic time: %ld seconds, %ld nanoseconds\n", ts.tv_sec, ts.tv_nsec); return 0; } ``` 在这个例子中: - 我们包含了 `<time.h>` 来获得对 `clock_gettime` 和其他时间相关的函数及数据结构的支持; - 使用了 `struct timespec` 结构体存储秒(`tv_sec`)和纳秒(`tv_nsec`); - 调用了 `clock_gettime` 函数传入 `CLOCK_MONOTONIC` 参数读取该特定类型时钟; 如果你想要更详细地了解如何处理不同类型的任务调度、超时机制或者其他高级功能,则可以继续深入学习更多关于 Linux 下的定时器 API 及其应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扳手的海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值