条件变量的简易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
相关文章:
条件变量的简易C++实现版
条件变量通常与互斥锁一起使用,用于线程间的同步。以下是条件变量常用的一些函数: ①std::condition_variable::wait(lock, pred):线程调用此函数时,会原子性地释放锁并阻塞当前线程,等待另一个线程调用 notify_one 或…...
目标检测评价标准
主要借鉴:https://github.com/rafaelpadilla/Object-Detection-Metrics?tabreadme-ov-file 主要评价指标、术语: Intersection Over Union (IOU):两个检测框交集面积与并集面积的比值 True Positive (TP):IOU大于阈值的检测框…...
C51-- 蓝牙,WIFI模块
HC-08蓝牙模块: 蓝牙 -- 最好用的 串口透传 模块 透传 -- 透明传送,指的是在数据传输的过程中,通过无线的方式这组数据不发生任何形式的改变, 仿佛传输过程是透明的,同时保证传输质量,最终原封不动的传送到接收者手…...
HN热帖|替换Redis的一场赛跑
3 月 21 日, Redis Ltd. 宣布了一项重大决定:Redis “内存数据存储”项目从 Redis 7.4 版本开始将以非自由的、源代码可用的许可证发布。这一消息并不受欢迎,但也并非完全意外。这次的变化的不同寻常之处是市面上已经有了多个 Redis 替代品可…...
Kubernetes(k8s):网络插件之Calico安装与详解
Kubernetes(k8s):网络插件之Calico安装与详解 1、什么是Calico?2、安装和配置Calico(控制节点-master执行)3、配置网络策略4、 Calico 的 yaml 文件部分详解1、ConfigMap配置2、DaemonSet 配置 5、calico-k…...
Chrome base 库详解:工具类和常用类库
Chrome浏览器使用了一个强大的库名为base,它包括了许多工具类和常用类库,以支持Chrome的底层功能和性能优化。在本文中,我们将详细阐述base库中的每个子项,并提供示例代码来展示其用法。 base 库的基本结构 Chrome的base库是一个…...
Nginx开发实战三:替换请求资源中的固定数据
文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址,我们通过nginx可以很便捷的将其改为外网访问,但是在外网访问这个地址后,…...
如何在Python中实现多线程和多进程?
如何在Python中实现多线程和多进程? 在Python中,多线程和多进程是实现并发编程的两种主要方式。它们各自有其特点和适用场景。下面将分别介绍如何在Python中实现多线程和多进程,并探讨它们的优缺点。 一、多线程 Python的标准库提供了thre…...
Redis面试题10道
1、什么是 Redis?简述它的优缺点? Redis 的全称是:Remote Dictionary.Server,本质上是一个 Key-Value 类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作…...
vue3从精通到入门6:v-memo指令
v-memo是一个用于优化组件渲染性能的指令。它允许你根据某个条件来缓存组件的虚拟 DOM 树,从而在条件没有变化时避免不必要的重新渲染。这对于那些接收大量 props 且渲染成本较高的组件来说非常有用。 用法 v-memo 指令接受一个表达式或一个数组作为参数࿰…...
【算法集训】基础算法:双指针
344. 反转字符串 // 双指针思路 void reverseString(char* s, int sSize) {int i 0,j sSize - 1;while(i < j) {char tmp s[i];s[i] s[j];s[j] tmp;i , j --;} }392. 判断子序列 // 双指针 bool isSubsequence(char* s, char* t) {// 定义s和t的下标指针int i 0, j …...
李白打酒加强版(c++实现)
题目 话说大诗人李白,一生好饮。 幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。 他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,…...
平价运动蓝牙耳机哪个品牌好?必选的5个爆款品牌,超高性价比!
蓝牙耳机,作为连接我们与音乐的桥梁,其重要性不言而喻,特别是平价运动蓝牙耳机,更是广大消费者的心头好,作为一位长期关注数码产品,特别是对蓝牙耳机有深入研究的爱好者,我深知在琳琅满目的市场…...
Android ImageView以及实现截图
实现效果 截图前 截图后 代码 package cn.jj.huaweiad;import android.annotation.SuppressLint; import android.graphics.Bitmap; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGro…...
剑指offer--数组中重复的数字
一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…...
【THM】SQL Injection(SQL注入)-初级渗透测试
简介 SQL(结构化查询语言)注入,通常称为 SQLi,是对 Web 应用程序数据库服务器的攻击,导致执行恶意查询。当 Web 应用程序使用未经正确验证的用户输入与数据库进行通信时,攻击者有可能窃取、删除或更改私人数据和客户数据,并攻击 Web 应用程序身份验证方法以获取私有数据…...
数码论坛系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)
本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读300套最新项目持续更新中..... 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含ja…...
vue3性能提升主要通过哪几方面?
📝个人主页:爱吃炫迈 💌系列专栏:Vue 🧑💻座右铭:道阻且长,行则将至💗 文章目录 编译优化diff算法优化提取动态节点 静态提升预字符串化缓存内联事件处理函数SSR优化 源…...
跨境电商IP防关联是什么?有什么作用?
做跨境电商的朋友应该都知道IP防关联这个词,那么为何IP需要防关联呢?今天为大家来解答这个问题。 跨境电商IP防关联是指在跨境电商运营中,通过采取一系列技术手段,确保每个跨境电商账号使用独立的IP地址,以避免账号之间因为IP地址…...
git仓库太大只下载单个文件或文件夹
有没有这样的苦恼:仓库太大,只想下载其中某些文件(夹)? 一招解决: ./down_folder_from_git.sh https://github.com/facebook/infer main Makefile FILES.md scripts examples ./down_folder_from_git.sh https://github.com/Ten…...
lingbot-depth-pretrain-vitl-14惊艳效果:RGB输入→INFERNO伪彩深度图动态生成演示
lingbot-depth-pretrain-vitl-14惊艳效果:RGB输入→INFERNO伪彩深度图动态生成演示 1. 模型概述 LingBot-Depth (Pretrained ViT-L/14) 是一款基于 DINOv2 ViT-Large/14 编码器的深度估计与补全模型,拥有 321M 参数。该模型采用创新的 Masked Depth Mo…...
分支限界法 vs 回溯法:5个关键区别和实际应用场景对比
分支限界法与回溯法:核心差异与工程实践指南 在解决复杂组合优化问题时,算法选择往往决定了程序的执行效率。当面对NP难问题时,两种经典算法——分支限界法和回溯法——常被开发者拿来比较。本文将深入剖析这两种算法的本质区别,并…...
WeMod Pro免费解锁终极指南:两种补丁方法完整对比与实战教程
WeMod Pro免费解锁终极指南:两种补丁方法完整对比与实战教程 【免费下载链接】Wemod-Patcher WeMod patcher allows you to get some WeMod Pro features absolutely free 项目地址: https://gitcode.com/gh_mirrors/we/Wemod-Patcher 还在为WeMod Pro的高级…...
LVGL字体扩展避坑指南:freetype缓存管理导致的内存泄漏问题排查实录
LVGL字体扩展深度解析:如何规避freetype缓存管理中的内存泄漏陷阱 在嵌入式GUI开发中,LVGL结合freetype的动态字体加载功能为多语言支持提供了强大支持,但这也带来了内存管理的复杂性。本文将深入探讨一个典型场景:当项目需要频繁…...
3分钟解决Word论文格式难题:免费获取APA第7版参考文献样式终极指南
3分钟解决Word论文格式难题:免费获取APA第7版参考文献样式终极指南 【免费下载链接】APA-7th-Edition Microsoft Word XSD for generating APA 7th edition references 项目地址: https://gitcode.com/gh_mirrors/ap/APA-7th-Edition 还在为Word中找不到APA第…...
顺利毕业!一个能读懂学校要求的AI论文助手
作为一名即将毕业的大四学生,写毕业论文这件事,就像一座大山压在我心头。选题没方向,文献看不懂,最要命的是,学校发的那个十几页的写作要求,看得我头都大了,生怕自己辛辛苦苦写出来,…...
RWKV7-1.5B-g1a参数详解教程:temperature/top_p/max_new_tokens调优指南
RWKV7-1.5B-g1a参数详解教程:temperature/top_p/max_new_tokens调优指南 1. 模型简介 rwkv7-1.5B-g1a 是基于 RWKV-7 架构的多语言文本生成模型,特别适合以下场景: 基础问答文案续写简短总结轻量中文对话 这个模型在单卡 24GB 显存的设备上…...
Diagrams:轻量化且多语言支持的Visio替代方案
1. 为什么你需要一个Visio替代方案? 如果你经常需要画流程图、架构图或者UML图,肯定对Microsoft Visio不陌生。作为一款老牌绘图工具,Visio确实功能强大,但它的缺点也同样明显。首先就是价格问题,正版Visio的订阅费用不…...
大模型赋能金融底稿搜索:告别大海捞针,实现高效精准合规管理!
文章主要介绍了达观数据利用大模型技术升级其底稿搜索产品,为金融行业带来革命性的变化。传统底稿搜索存在关键词匹配局限、非结构化文件解析困难、溯源关联不便和合规风险高等问题。达观数据通过深度语义理解、全格式解析兼容、智能要素抽取、全链路溯源关联和开箱…...
如何智能检测微信单向好友?WechatRealFriends全方位解决方案
如何智能检测微信单向好友?WechatRealFriends全方位解决方案 【免费下载链接】WechatRealFriends 微信好友关系一键检测,基于微信ipad协议,看看有没有朋友偷偷删掉或者拉黑你 项目地址: https://gitcode.com/gh_mirrors/we/WechatRealFrien…...
