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

本文介绍如何利用pthread_cond_timedwait实现相对时间等待超时,并提供了一段示例代码。通过设置pthread_condattr_setclock为CLOCK_MONOTONIC,可以避免因系统时间调整而导致的等待超时问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值