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

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

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


 

`pthread_cond_timedwait()`是一个用于线程间通信的函数,它允许线程在一个条件变量上等待直到某个特定条件被满足或者超时。下面是一个简单的例子,展示如何在Linux中使用这个函数实现定时任务: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <time.h> #define MAX_THREADS 5 #define TIMER_DELAY 3 typedef struct { int shared_value; pthread_cond_t cond; // 条件变量 pthread_mutex_t mutex; // 互斥锁 } SharedData; void *thread_func(void *arg) { SharedData *data = (SharedData *) arg; pthread_mutex_lock(&data->mutex); // 假设我们有一个循环,每秒钟检查一次共享值 for (int i = 0; ; i++) { time_t start_time = time(NULL); while ((time(NULL) - start_time) < TIMER_DELAY && data->shared_value != 1) { pthread_cond_wait(&data->cond, &data->mutex); // 等待条件满足 } if (data->shared_value == 1) { printf("Thread %d woke up after %ld seconds.\n", pthread_self(), TIMER_DELAY); break; } } pthread_mutex_unlock(&data->mutex); return NULL; } int main() { SharedData shared_data = {0, PTHREAD_COND_INITIALIZER, PTHREAD_MUTEX_INITIALIZER}; pthread_t threads[MAX_THREADS]; // 初始化共享值为0 shared_data.shared_value = 0; // 创建线程并启动 for (int i = 0; i < MAX_THREADS; ++i) { pthread_create(&threads[i], NULL, thread_func, &shared_data); } // 等待所有线程完成 for (int i = 0; i < MAX_THREADS; ++i) { pthread_join(threads[i], NULL); } return 0; } ``` 在这个例子中,主线程设置了`shared_data.shared_value`为0,并创建了几个线程,在一个循环中等待`TIMER_DELAY`秒后检查共享值。当`shared_data.shared_value`变更为1时,线程就会通过`pthread_cond_wait()`醒来。注意,每个线程都持有`shared_data.mutex`,所以在等待期间不会被其他线程修改共享数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值