do_wait_until pthread_cond_timedwait
时间: 2025-07-06 10:57:41 浏览: 9
### 正确使用 `pthread_cond_timedwait` 实现等待直到条件满足
为了确保线程能够安全地等待特定条件的发生,可以采用如下方法来正确使用 `pthread_cond_timedwait` 函数。此函数允许指定一个超时时间,在这段时间内如果没有达到预期条件,则会返回给调用者。
#### 初始化互斥锁和条件变量
在开始之前,需要初始化互斥量 (`mutex`) 和条件变量 (`cond_var`). 这两个对象用于同步访问共享资源以及通知其他线程当某些事件发生时唤醒它们:
```c++
#include <pthread.h>
#include <time.h>
// 定义全局或类成员变量
pthread_mutex_t mutex;
pthread_cond_t cond_var;
void init_sync_objects() {
pthread_mutex_init(&mutex, NULL);
pthread_cond_init(&cond_var, NULL);
}
```
#### 设置绝对超时时间
对于 `pthread_cond_timedwait`, 需要提供一个表示绝对时刻的时间结构体作为参数。通常情况下,可以通过获取当前时间和增加一定的延迟来计算这个未来的时间点:
```c++
struct timespec get_timeout_time(int seconds_into_future) {
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts); // 获取实时钟表时间
// 增加秒数到纳秒级别上
ts.tv_sec += seconds_into_future;
return ts;
}
```
#### 使用 `pthread_cond_timedwait`
现在可以在适当的位置插入下面这段代码片段,它展示了如何让线程进入休眠状态并等待另一个线程通过信号触发其继续执行:
```c++
bool wait_until_condition_is_met(bool* condition_flag_ptr,
int timeout_seconds) {
bool result = false;
pthread_mutex_lock(&mutex);
while (!(*condition_flag_ptr)) {
struct timespec abs_timeout = get_timeout_time(timeout_seconds);
int ret_val = pthread_cond_timedwait(
&cond_var,
&mutex,
&abs_timeout
);
if (ret_val == ETIMEDOUT) break; // 超时则退出循环
// 如果不是因为超时而醒来,则重新检查条件标志位
}
if (*condition_flag_ptr) {
*condition_flag_ptr = false; // 清除条件标记
result = true;
}
pthread_mutex_unlock(&mutex);
return result;
}
```
上述代码实现了以下功能:
- 锁定互斥量以保护对共享数据的操作。
- 当前条件下不成立时反复调用 `pthread_cond_timedwait`.
- 计算出期望的绝对结束时间,并将其传递给 `pthread_cond_timedwait`.
- 若因超时原因被唤醒,则终止等待过程;否则再次验证条件是否已达成.
- 解锁互斥量以便其他线程可以获得该锁.
需要注意的是,这里假设有一个外部机制负责设置 `*condition_flag_ptr` 的值为真,从而告知等待中的线程条件已经满足[^2].
阅读全文
相关推荐


















