pthread_cond_timedwait()在官方文档中介绍了按绝对时间等待超时,但是几乎没有对按相对等待做说明。然而绝对时间模式有个最致命的缺点,就是在设置等待时间的时候,若系统时间发生了调整,可能出现永远等不到超时的极端情况。使用相对时间可以避免上述问题。
下面给出一段示例代码说明如何使pthread_cond_timedwait按相对时间等待超时,其中最关键的一点就是使用pthread_condattr_setclock设置pthread_cond_timedwait成相对时间模式:
#include <stdio.h>
#include <pthread.h>
#include <time.h>
typedef struct mutex_cond
{
pthread_condattr_t cattr;
pthread_mutex_t i_mutex;
pthread_cond_t i_cv;
void* i_sigevent;
}mutex_cond_t;
// g++ -o pwait pwait.cpp -lpthread -lrt
int main()
{
mutex_cond_t mcond;
int ret = pthread_condattr_init(&(mcond.cattr));
if (ret != 0)
{
return (1);
}
mcond.i_sigevent = NULL;
ret = pthread_mutex_init ( &(mcond.i_mutex), NULL);
ret = pthread_condattr_setclock(&(mcond.cattr), CLOCK_MONOTONIC);
ret = pthread_cond_init(&(mcond.i_cv), &(mcond.cattr));
struct timespec tv;
while(1)
{
clock_gettime(CLOCK_MONOTONIC, &tv);
printf("now time:%d\n", tv.tv_sec);
tv.tv_sec += 20;// 设置20秒后没收到事件超时返回
ret = pthread_cond_timedwait(&(mcond.i_cv), &(mcond.i_mutex), &tv);
}
return 0;
}