当前位置: 首页 > news >正文

条件变量的简易C++实现版

条件变量通常与互斥锁一起使用,用于线程间的同步。以下是条件变量常用的一些函数:

①std::condition_variable::wait(lock, pred):线程调用此函数时,会原子性地释放锁并阻塞当前线程,等待另一个线程调用 notify_one 或 notify_all 来通知。pred 是一个可选的谓词,用于额外的条件检查,如果传入 pred,则当条件不满足时线程会继续等待。当被通知后,wait 函数会重新获取锁。

②std::condition_variable::notify_one:通知一个等待在条件变量上的线程,使得其中一个线程被唤醒,继续执行,通常当对共享资源作出改变后调用该函数。

③std::condition_variable::notify_all:通知所有等待在条件变量上的线程,使得全部线程被唤醒,继续执行。

这些函数通常会和互斥锁(std::mutex)一起使用,例如:

std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, []{ return ready; });  // 等待 ready 变成 true
// 使用lambda表达式

这里 cv 表示 std::condition_variable,mtx 表示 std::mutex,ready 是一个共享的条件,用于控制线程的同步。

举个见到的例子。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <queue>std::queue<int> q;
std::mutex mtx;
std::condition_variable cv;using namespace std;
void producer() {for (int i = 0; i < 10; ++i) {std::unique_lock<std::mutex> lock(mtx);q.push(i);std::cout << "Producing " << i << std::endl;lock.unlock();cv.notify_one(); // 通知消费者std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 为了方便观察,加入延迟}
}void consumer() {for (int i = 0; i < 10; ++i) {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, []{ return !q.empty(); }); // 等待直到队列不为空std::cout << "Consuming " << q.front() << std::endl;q.pop();}
}int main() {std::thread producerThread(producer);std::thread consumerThread(consumer);producerThread.join();consumerThread.join();return 0;
}

结果是:

./a.out 
Producing 0
Consuming 0
Producing 1
Consuming 1
Producing 2
Consuming 2
Producing 3
Consuming 3
Producing 4
Consuming 4
Producing 5
Consuming 5
Producing 6
Consuming 6
Producing 7
Consuming 7
Producing 8
Consuming 8
Producing 9
Consuming 9
http://www.lryc.cn/news/330358.html

相关文章:

  • 目标检测评价标准
  • C51-- 蓝牙,WIFI模块
  • HN热帖|替换Redis的一场赛跑
  • Kubernetes(k8s):网络插件之Calico安装与详解
  • Chrome base 库详解:工具类和常用类库
  • Nginx开发实战三:替换请求资源中的固定数据
  • 如何在Python中实现多线程和多进程?
  • Redis面试题10道
  • vue3从精通到入门6:v-memo指令
  • 【算法集训】基础算法:双指针
  • 李白打酒加强版(c++实现)
  • 平价运动蓝牙耳机哪个品牌好?必选的5个爆款品牌,超高性价比!
  • Android ImageView以及实现截图
  • 剑指offer--数组中重复的数字
  • 【THM】SQL Injection(SQL注入)-初级渗透测试
  • 数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
  • vue3性能提升主要通过哪几方面?
  • 跨境电商IP防关联是什么?有什么作用?
  • git仓库太大只下载单个文件或文件夹
  • OpenHarmony实战:RK3568 开发板镜像烧录指南
  • Asp.net Core 中一键注入接口
  • 怎么让ChatGPT批量写作原创文章
  • 【SqlServer】Alwayson收缩日志
  • 视觉里程计之对极几何
  • 数据可视化高级技术(Echarts)
  • 设计模式——行为型——责任链模式Chain Of Responsibility
  • 设计模式之工厂方法模式精讲
  • JS实现省市区三级联动(json假数据)
  • Fastjson配置消息转换器(时间格式问题)
  • 安卓Android 架构模式及UI布局设计