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

c++ std::mutex与std::condition_variable

1. std::mutex

lock()加锁;  try_lock()尝试加锁; unlock()解锁;

std::mutex m_mutex;    m_mutex.lock();
...
m_mutex.unlock();

2. std::lock_guard

 类模板;等同自动锁,直接取代lock()和unlock(); 构造时加锁,析构时解锁;

std::mutex m_mutex;
{std::lock_guard<std::mutex> myLock(m_mutex);...
} //作用域执行完,自动unlock解锁;

3. std::unique_lock

类模板, 比lock_guard灵活,效率比lock_guard差一点,内存占用比lock_guard多一点;所以工作中使用lock_guard就够了;

3.1 unuque_lock的第二参数

std::adopt_lock:   表示互斥量已经被lock()了 (互斥量必须提前lock()否则错误); 

std::mutex m_mutex;
{m_mutex.lock();std::unique_lock<std::mutex> myLock(m_mutex, std::adopt_lock);
}

std::defer_lock: 没有给mutex加锁,初始化一个没有加锁的mutex; 故不能提前自己加锁,否则错误;

std::mutex m_mutex;{//之前不能加锁std::unique_lock<std::mutex> myLock(m_mutex, std::defer_lock);myLock.lock();}

std::try_to_lock:  尝试用mutex加锁,加锁失败会立即返回,不阻塞; 前提是不能自己先加锁;

std::mutex m_mutex;
{//之前不能加锁std::unique_lock<std::mutex> myLock(m_mutex, std::try_to_lock);if (myLock.owns_lock()) {std::cout << "get lock suc" << std::endl;}else {std::cout << "get lock failed" << std::endl;}
}

3.2 成员函数

lock(): 加锁;

unlock():解锁;

std::mutex m_mutex;
{std::unique_lock<std::mutex> myLock(m_mutex);...myLock.unlock();myLock.lock();...myLock.unlock(); //可加可不加
}

 try_lock():尝试加锁;

owns_lock(): 加锁成功返回true, 加锁失败返回false;

release(): 返回管理的锁对象指针,并将其置空;

//若原来 mutex处于加锁状态,那么接管过来需要我们自己解锁;
std::unique_lock<std::mutex> myLock(m_mutex1);
std::timed_mutex *ptx = myLock.release();//现在你有责任自己解锁了;
ptx->unlock();

4. std::condition_variable

条件变量,用于线程同步; 搭配std::mutex一起使用;

 4.1 wait

/* 源码 */
void wait(unique_lock<mutex>& _Lck) { // wait for signal// Nothing to do to comply with LWG-2135 because std::mutex lock/unlock are nothrow_Cnd_wait(_Mycnd(), _Lck.mutex()->_Mymtx());
}template <class _Predicate>
void wait(unique_lock<mutex>& _Lck, _Predicate _Pred) { // wait for signal and test predicatewhile (!_Pred()) {wait(_Lck);}
}

带有_Predicate 的重载函数用于判断条件是否满足;

std::mutex m_mutex;
std::condition_variable m_cond;{std::unique_lock<std::mutex> lock(m_mutex);#if 1/*wait将解锁互斥量,并阻塞到本行, 直到其他某个线程调用notify_one/all唤醒;当被唤醒后,wait()尝试获取互斥量;获取成功即上锁;判断参数2 lambda结果,为false则解锁,阻塞本行;为true,则wait()返回,继续执行下面代码;*/m_cond.wait(lock, [this] {if (条件==true) return true;return false;});...#else//wait将解锁互斥量,并阻塞到本行; 直到其他某个线程调用notify_one/all唤醒;//wait()后从新获取锁; 获取成功直接返回,继续下面流程m_cond.wait(lock);流程走到这里, lock一定是锁着的;#endif
}

4.2 notify

notify_one: 唤醒wait等待的一个线程,只能唤醒一次;

notify_all: 唤醒wait等待的所有线程,广播形式全部通知; 但是只有一个获取锁成功;

//m_cond.notify_one(); //唤醒一个
m_cond.notify_all();//唤醒多个线程

相关文章:

c++ std::mutex与std::condition_variable

1. std::mutex lock()加锁; try_lock()尝试加锁; unlock()解锁; std::mutex m_mutex; m_mutex.lock(); ... m_mutex.unlock(); 2. std::lock_guard 类模板;等同自动锁,直接取代lock()和unlock(); 构造时加锁,析构时解锁; std::mutex m_mutex; {std::lock_guard<std:…...

Aspose.Tasks for .NET V23Crack

Aspose.Tasks for .NET V23Crack 改进了大型项目的内存占用。 添加了API&#xff0c;允许您在应用程序无法访问系统字体文件夹时指定用户的字体文件夹。 Aspose.Tasksfor.NET是处理MicrosoftProject文件的可靠的项目管理API。API支持在不依赖Microsoft Project的情况下读取、写…...

vue过渡及动画

文章目录 前言类名使用自己定义动画样式多个元素过渡使用第三方库 前言 对于vue中的过渡与动画&#xff0c;官网上是这样概述的&#xff1a; Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。包括以下工具&#xff1a; 在 CSS 过渡和动画中自动…...

Linux环境下SVN服务器的搭建与公网访问:使用cpolar端口映射的实现方法

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…...

【ubuntu】 DNS 设置工具 resolvectl

什么是 resolvectl “resolvectl” 是一个用于管理系统 DNS 解析配置的命令行工具。它是 systemd-resolved 服务的一部分&#xff0c;该服务是在许多基于 Systemd 的 Linux 发行版中用于管理网络配置和 DNS 解析的系统服务。 通过 resolvectl 命令&#xff0c;可以查看当前系…...

Keepalived+Lvs(dr)调度器主备配置小实验

目录 前言 一、实验拓扑图 二、配置LVS&#xff08;dr&#xff09;模式 三、配置调配器热备 四、测试 总结 前言 Keepalived和LVS&#xff08;Linux Virtual Server&#xff09;是两个常用的开源软件&#xff0c;通常结合使用以提供高可用性和负载均衡的解决方案。 Keepalive…...

第四讲Java基本语法——数组结构(多维数组)

前言 前面几讲,我们讲了Java基本语法,初学者也能够有一定的入门。本讲,我们也是继续来讲解一下Java另一个基础语法——数组,其实在前面讲解数据类型的时候,我们也有提到数组是引用类型,那今天我们就来分析一下什么是数组,怎么用数组呢? 一、数组是什么 数组是…...

【题解】JZOJ6578 / 洛谷P5201[USACO2019Jan]Shortcut G

洛谷 P5201 [USACO19JAN] Shortcut G 题意 在一个带权无向连通图上&#xff0c;每个点有 a i a_i ai​ 只奶牛&#xff0c;奶牛会走最短路径到 1 1 1&#xff0c;如果有多条路径&#xff0c;选择字典序最小的&#xff0c;定义移动总时间为所有奶牛走到 1 1 1 的时间之和。…...

npm install sentry-cli失败的问题

1. 目前报错 2. 终端运行 npm set ENTRYCLI_CDNURLhttps://cdn.npm.taobao.org/dist/sentry-cli npm set sentrycli_cdnurlhttps://cdn.npm.taobao.org/dist/sentry-cli3. 再安装 npx sentry/wizardlatest -i nextjs即可成功...

Node opensslErrorStack 错误解决方法记录

从Git仓库中下载了一个老项目&#xff0c;使用npm install 安装后没有问题&#xff0c;当我使用npm run dev 的时候遇到了 OpenSSL 相关错误&#xff0c;例如 opensslErrorStack: [error:03000086:digital envelope routines::initialization error] 网上找了一下相关信息&am…...

你知道什么是Grandmillennial风格吗,进来看看吧

如果你既欣赏祖母的印花棉布扶手椅和大胆的图案&#xff0c;又喜欢千禧一代朋友现代家居中的开放空间和时尚家具&#xff0c;那么 "千禧一代 “风格就是为你量身打造的。它借鉴了几十年来的流行趋势&#xff0c;形成了一种独特的、带有现代风格的老式设计。 在典型的 &quo…...

App Inventor 2 开发 ChatGPT 对话App

ChatGPT大家应该不会陌生&#xff0c;它的回答内容非常的专业及深入&#xff0c;具有实际的可指导性。我们通过App Inventor 2开发一个简单的对话App&#xff0c;先看效果&#xff1a; App Inventor 2 ChatGPT教育领域对话演示 代码块如下&#xff1a; 用到的核心组件“ChatBot…...

SQL 大小敏感问题

在SQL中&#xff0c;关键字和函数名 是不区分 大小写的 比如&#xff08;select、where、order by 、group by update 等关键字&#xff09;&#xff0c;以及函数(ABS、MOD、round、min等) window系统默认是大小写不敏感 &#xff08;ZEN文件和zen 文件 不能同时存在&#xff…...

微信小程序+Taro 混编,Taro 使用微信原生 behaviors

最近有一个小程序项目&#xff0c;因为一些原因项目架构选择了微信小程序原生Taro 混编的方式进行开发&#xff0c;在开发的过程中发现 Taro 不支持使用原生的 behaviors 特性&#xff0c;因为混编的原因项目当中已有原生页面在使用 behaviors&#xff0c;所以需要一个方案在不…...

b树/b+树、时间轮、跳表、LSM-Tree

b树、b树&#xff1a;关系型数据库核心存储结构 1、为什么磁盘数据存储结构用B树、而不用红黑树 磁盘每次读取不是读一个节点、是返回一页数据。 红黑树每次遍历一个节点排除一半数据。 B树通常映射相邻的磁盘页数据。4K mysql索引一个节点隐射16k故而映射4倍&#xff0c;故…...

Unity OnDrawGizmos的简单应用 绘制圆形

编辑器和配置表各有各的好。 卡牌游戏即使再复杂&#xff0c;哪怕是梦幻西游&#xff0c;大话西游那种&#xff0c;甚至wow那种&#xff0c;用配表都完全没问题。但是崩坏3&#xff0c;或者鬼泣&#xff0c;格斗游戏&#xff0c;可视化编辑器是唯一的选择。 开发初期刚开始配技…...

Uniapp笔记(四)uniapp语法3

一、商品详情 1、从商品列表页跳转到商品详情页 在商品列表的项中绑定单击事件&#xff0c;并传递商品id值 <view class"goods-item" v-for"(item,index) in goodsList" :key"index" click"goGoodsDetail(item.goods_id)"> &…...

leetcode做题笔记105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 思路一&#xff1a;递归 struct TreeNode* buildTree(int* preorder, int preorderSize, int* ino…...

Python里的列表List求和

1、使用sum()函数 numbers [1, 2, 3, 4, 5] total sum(numbers) print(total) # 输出 15 2、注意事项 在使用 sum() 函数获取列表的总和时&#xff0c;需要注意以下几点&#xff1a; sum() 函数只能用于数字类型的可迭代对象&#xff0c;如果 iterable 中包含了非数字类…...

启动docker容器的几种方法和注意事项(docker-compose,dockerfile)

1&#xff1a;要启动容器必须都先创建好镜像文件 C:\Users\dell>docker images REPOSITORY TAG IMAGE ID CREATED SIZE poi 1.0 22738bb31074 4 hours ago 105MB redis latest 506734eb5e71 6 days ago 138MB ng…...

MRIcroGL终极指南:免费医学影像三维可视化快速上手

MRIcroGL终极指南&#xff1a;免费医学影像三维可视化快速上手 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL MRIcroGL是一款强大的医…...

构建时内容处理与类型安全:Content Collections 在现代前端项目中的应用

1. 项目概述&#xff1a;告别手动解析&#xff0c;拥抱类型安全的内容管理如果你和我一样&#xff0c;长期在 Next.js、SvelteKit 这类现代前端框架里折腾内容驱动的网站&#xff0c;比如博客、文档站或者产品页面&#xff0c;那你肯定对下面这个场景不陌生&#xff1a;项目根目…...

为什么你的AI啤酒海报总被印刷厂拒收?揭秘CMYK预演、DPI陷阱与Pantone映射的3重隐性门槛

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI啤酒海报印刷拒收现象的底层归因 AI生成的啤酒海报在印刷环节频繁被拒收&#xff0c;表面看是色彩偏差或分辨率不足&#xff0c;实则根植于生成模型与印刷工业链之间的语义断层与物理约束错配。印刷厂…...

别再用老方法了!手把手教你用Coilcraft在线工具搞定BUCK电感选型(附避坑指南)

别再用老方法了&#xff01;手把手教你用Coilcraft在线工具搞定BUCK电感选型&#xff08;附避坑指南&#xff09; 在电源设计领域&#xff0c;BUCK电路因其高效、稳定的特性成为工程师们的首选方案。然而&#xff0c;电感选型这个看似简单的环节却让不少资深工程师栽过跟头——…...

Legacy iOS Kit终极指南:老款iOS设备降级、越狱与恢复实战

Legacy iOS Kit终极指南&#xff1a;老款iOS设备降级、越狱与恢复实战 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit …...

DifyTimeTask插件:为Dify-on-Wechat打造轻量级定时任务引擎

1. 项目概述&#xff1a;一个为Dify-on-Wechat量身打造的定时任务引擎如果你正在使用Dify-on-Wechat&#xff08;DOW&#xff09;这个基于微信生态的智能对话机器人框架&#xff0c;并且苦于它没有原生的定时任务能力&#xff0c;那么你找对地方了。DifyTimeTask插件&#xff0…...

如何让macOS剪贴板成为你的超级助手?Clipy给你答案

如何让macOS剪贴板成为你的超级助手&#xff1f;Clipy给你答案 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy 你是否曾经在复制了一段重要信息后&#xff0c;不小心覆盖了它&#xff0c;然后懊恼地想要…...

别再踩坑了!Matlab调用HFSS 2021/2022版本执行VBS脚本的完整避坑指南(含VC++库修复)

Matlab与HFSS新版本集成&#xff1a;从环境诊断到脚本调优的全链路解决方案 当Matlab与HFSS的协同工作流程突然中断时&#xff0c;工程师们常常陷入版本兼容性和环境依赖的迷宫。本文将带您深入排查HFSS 2021/2022版本与Matlab集成的典型故障链&#xff0c;提供一套系统化的诊断…...

蓝桥杯备赛中借助大模型进行算法思路验证的实践与成本考量

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 蓝桥杯备赛中借助大模型进行算法思路验证的实践与成本考量 对于参加蓝桥杯等算法竞赛的选手而言&#xff0c;备赛过程充满了对各类…...

聚类算法详解

聚类算法作为无监督学习的核心分支&#xff0c;就像一位“智能分类师”&#xff0c;能在没有标签的数据集里&#xff0c;自动把相似的对象归为一类&#xff0c;把不同的对象分开。它广泛应用于客户分群、图像分割、异常检测等场景&#xff0c;接下来我们用通俗易懂的方式拆解常…...