c++中使用互斥锁mutex和条件变量实现同步

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

}

解释

  1. cv.wait_for(lck, duration, pred) :这是 std::condition_variable 的成员函数,允许线程等待一段时间或者直到满足特定条件。它的第二个参数是一个 std::chrono::duration 类型的对象,表示等待的时间段。在示例中,我们使用 std::chrono::seconds(1) 表示等待1秒钟。

  2. 超时处理 :如果等待超时(即工作线程在1秒内没有通知条件变量),cv.wait_for 将返回 false,此时 main 线程可以根据需要继续执行其他逻辑,例如打印超时消息。

  3. 工作线程通知 :在 worker_thread 中,通过设置 data_ready = true; 和调用 cv.notify_one(); 来通知 main 线程数据已准备好。

相关推荐
〝七夜5692 分钟前
JVM内存结构
java·开发语言·jvm
初级炼丹师(爱说实话版)2 分钟前
JAVA泛型作用域与静态方法泛型使用笔记
java·开发语言·笔记
Mr_WangAndy4 分钟前
C++17 新特性_第二章 C++17 语言特性_std::any和string_view
c++·string_view·c++40周年·c++17新特性·c++新特性any
技术净胜38 分钟前
MATLAB二维绘图教程:plot()函数全解析(线条样式/颜色/标记/坐标轴设置)
开发语言·matlab
Slow菜鸟1 小时前
Java开发规范(八)| 安全规范—企业级应用的“架构级底线”
java·开发语言·安全
憨憨崽&1 小时前
进击大厂:程序员必须修炼的算法“内功”与思维体系
开发语言·数据结构·算法·链表·贪心算法·线性回归·动态规划
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于Java的公职备考在线学习系统的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
水天需0102 小时前
C++ 三种指针转换深度解析
c++
二川bro2 小时前
模型部署实战:Python结合ONNX与TensorRT
开发语言·python
联系QQ:276998852 小时前
电化学与冷启动仿真的赝电容计算及GITT扩散系数研究——阻抗分析拟合与全电池电容器性能评估
开发语言