当前位置: 首页 > 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…...

bash: conda: command not found

问题描述&#xff1a; 在Pycharm上用SSH远程连接到服务器&#xff0c;打开Terminal准备查看用 conda 创建的虚拟环境时&#xff0c;却发现调用 conda 指令时出现以下报错&#xff1a; -bash: conda: command not found如果使用Xshell 利用端口号直接连接该 docker 容器&#…...

Leetcode-每日一题【剑指 Offer 36. 二叉搜索树与双向链表】

题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点&#xff0c;只能调整树中节点指针的指向。 为了让您更好地理解问题&#xff0c;以下面的二叉搜索树为例&#xff1a; 我们希望将这个二叉搜索树转化为双向循环链表…...

ctfshow-萌新专属红包题

0x00 前言 CTF 加解密合集CTF Web合集 0x01 题目 0x02 Write Up 访问之后是一个登录页面&#xff0c;扫了目录&#xff0c;试了sql注入&#xff0c;没办法于是跑一跑弱口令&#xff0c;所以有事没事&#xff0c;admin弱口令跑一跑 搜索 微信公众号 皓月当空w 发送关键字 字典…...

谷歌面试-扔鸡蛋

今天想跟大家分享一个有意思的面试题&#xff0c;这让我再一次感叹思维的奇妙&#xff0c;接下来我们一起看看吧~ 首先来看看题目&#xff1a; 你有2颗鸡蛋&#xff0c;需要以最少的尝试次数来判断在100层的高楼上&#xff0c;哪一层楼是鸡蛋的安全层。 换句话说&#xff0c…...

Unity血条制作

一、使用UGUI制作血条 我一般使用image制作血条&#xff0c;当然&#xff0c;也可以使用滑动组件Slider。image的具体操作步骤如下 普通血条 1、在Hierarchy面板中&#xff0c;创建两个image组件&#xff0c;将其中一个设置为另外一个的子节点 2、在Inspector面板中&#…...

vue,uniapp生成二维码

话不多说直接开干 先是vue的 1&#xff0c;首先按照一下依赖 npm install --save qrcode 2,在需要使用的页面引入 import QRCode from qrcode; 3,使用 const codeDetail (item) > {//这个item.code是要生成的数据&#xff0c;我的是一串数字QRCode.toDataURL(item.co…...

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测 目录 分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测…...

STM32启动模式详解

文章目录 前置知识1. 单片机最小系统组成2. BOOT电路3. 三种启动模式4. 存储器映射 从主FLASH启动从系统存储区启动从SRAM启动 前置知识 1. 单片机最小系统组成 一个单片机最小系统由电源、晶振、下载电路、BOOT电路、和复位电路组成。少一个单片机都启动不了。 2. BOOT电路 …...

go语言中的切片

切片底层 切片&#xff08;Slice&#xff09;是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活&#xff0c;支持自动扩容。 切片是一个引用类型&#xff0c;它的内部结构包含地址、长度和容量。切片一般用于快速地操作一块数据集合。 切片…...

HTML-常见标签、HTML5新特性

HTML 软件架构 1.C/S架构 (1) C/S架构即Client/Server&#xff08;客户机/服务器&#xff09;结构。 (2) C/S 架构特点 ​ C/S结构在技术上很成熟&#xff0c;它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是…...

设计一个网页要多少钱/太原seo优化公司

https://wiki.videolan.org/AndroidCompile/...

微信知彼网络网站建设/dw友情链接怎么设置

最近几年&#xff0c;在DDD的领域&#xff0c;我们经常会看到CQRS架构的概念。我个人也写了一个ENode框架&#xff0c;专门用来实现这个架构。CQRS架构本身的思想其实非常简单&#xff0c;就是读写分离。是一个很好理解的思想。就像我们用MySQL数据库的主备&#xff0c;数据写到…...

丹东 建设集团 招聘信息网站/邢台网站网页设计

前言 CSS确实很重要&#xff0c;且有点奇技淫巧&#xff0c;看起来规则十分简单&#xff0c;但是创意更重要&#xff0c;如何用css构造出自己想要的效果&#xff0c;写的代码好看优雅十分重要。 在看了不借助Echarts等图形框架原生JS快速实现折线图效果并自己重新实现了以后&am…...

长沙住建信息中心网站/能够免费换友链的平台

数据结构是&#xff1a;数组链表红黑树 1、putVal 插入值&#xff1a;得到数组下标索引值&#xff0c; 如果数据下标处为null&#xff0c;则放入该位置&#xff0c; 如果不为空&#xff0c;判断key是否相等&#xff0c; 如果相等&#xff0c;则…...

优酷网站怎么做的/云优化

【gmoj】 【纯模拟】 好数 题目 解题思路 第一类好数&#xff0c;要不就是全部取第一位&#xff0c;要不就是取第一位1 第二类好数&#xff0c;直接模拟两个数&#xff0c;以及不一样的是哪个位&#xff0c;取最小且大于x的 题目 #include<iostream> #include<cstd…...

如何查看网站用什么代码做的/深圳市企业网站seo

今天早上还是和往常一样&#xff0c;一杯豆奶&#xff0c;可不知怎么地&#xff0c;感觉今天的豆奶有点儿甜呀&#xff01;难道这就是传说中的甘尽苦来&#xff1f;我这好几斤的小心脏。还是说一下最近的想法吧。虽然有点儿过分&#xff0c;但还是值得记录一下&#xff0c;毕竟…...