在C++中,条件变量(std::condition_variable
)本身并不支持直接的超时功能。通常情况下,我们会结合 std::chrono
中的时间点或持续时间来实现等待超时的效果。下面是一个示例,演示如何使用条件变量等待一段时间,并在超时时继续执行其他逻辑:
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
std::mutex mtx;
std::condition_variable cv;
bool data_ready = false;
void worker_thread() {
// 模拟耗时的任务
std::this_thread::sleep_for(std::chrono::seconds(2));
// 获取互斥锁
std::unique_lock<std::mutex> lck(mtx);
// 修改共享条件
data_ready = true;
std::cout << "Worker thread signals data ready\n";
// 通知条件变量
cv.notify_one();
}
int main() {
// 创建工作线程
std::thread worker(worker_thread);
// 等待数据准备好,但最多等待1秒钟
{
std::unique_lock<std::mutex> lck(mtx);
if (cv.wait_for(lck, std::chrono::seconds(1), []{ return data_ready; })) {
std::cout << "Main thread detects data ready\n";
} else {
std::cout << "Timeout: Main thread continues without data\n";
}
}
// 等待工作线程结束
worker.join();
return 0;
}
解释
-
cv.wait_for(lck, duration, pred)
:这是std::condition_variable
的成员函数,允许线程等待一段时间或者直到满足特定条件。它的第二个参数是一个std::chrono::duration
类型的对象,表示等待的时间段。在示例中,我们使用std::chrono::seconds(1)
表示等待1秒钟。 -
超时处理 :如果等待超时(即工作线程在1秒内没有通知条件变量),
cv.wait_for
将返回false
,此时main
线程可以根据需要继续执行其他逻辑,例如打印超时消息。 -
工作线程通知 :在
worker_thread
中,通过设置data_ready = true;
和调用cv.notify_one();
来通知main
线程数据已准备好。