在使用 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
的时间是从系统启动时开始计算的,不会被系统时间的变化(如调整或同步)所影响,因此非常适合用于超