pthread_cond_timedwait按相对时间等待超时完整示例代码

pthread_cond_timedwait()在官方文档中介绍了按绝对时间等待超时,但是几乎没有对按相对等待做说明。然而绝对时间模式有个最致命的缺点,就是在设置等待时间的时候,若系统时间发生了调整,可能出现永远等不到超时的极端情况。使用相对时间可以避免上述问题。

下面给出一段示例代码说明如何使pthread_cond_timedwait按相对时间等待超时,其中最关键的一点就是使用pthread_condattr_setclock设置pthread_cond_timedwait成相对时间模式:

 

#include 
#include 
#include 

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;
}


 

你可能感兴趣的:(pthread_cond_timedwait按相对时间等待超时完整示例代码)