C++11std::unique_lock与std::lock_guard的区别及多线程应用实例

C++11 std::unique_lock与std::lock_guard区别及多线程应用实例 C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。 针对以上的问题,C++11... 阅读详情

C++11std::unique_lock与std::lock_guard的区别及多线程应用实例

C++多线程编程中通常会对共享的数据进行写保护,以防止多线程在对共享数据成员进行读写时造成资源争抢导致程序出现未定义的行为。通常的做法是在修改共享数据成员的时候进行加锁--mutex。在使用锁的时候通常是在对共享数据进行修改之前进行lock操作,在写完之后再进行unlock操作,进场会出现由于疏忽导致由于lock之后在离开共享成员操作区域时忘记unlock,导致死锁。

针对以上的问题,C++11中引入了std::unique_lock与std::lock_guard两种数据结构。通过对lock和unlock进行一次薄的封装,实现自动unlock的功能。

 

std::mutex mut;

void insert_data()
{
	std::lock_guard lk(mut);
	queue.push_back(data);
}

void process_data()
{
	std::unqiue_lock lk(mut);
	queue.pop();
}
std::unique_lock 与std::lock_guard都能实现自动加锁与解锁功能,但是std::unique_lock要比std::lock_guard更灵活,但是更灵活的代价是占用空间相对更大一点且相对更慢一点。

 

通过实现一个线程安全的队列来说明两者之间的差别。

 

template 
class ThreadSafeQueue{
public:
         void Insert(T value);
         void Popup(T &value);
         bool Empety();

private:
       mutable std::mutex mut_;
       std::queue que_;
       std::condition_variable cond_;
};

 

 

template 
void ThreadSafeQueue::Insert(T value){
	std::lock_guard lk(mut_);
	que_.push_back(value);
	cond_.notify_one();
}


template 
void ThreadSafeQueue::Popup(T &value){
	std::unique_lock lk(mut_);
	cond_.wait(lk, [this]{return !que_.empety();});
	value = que_.front();
	que_.pop();
}


template 
bool ThreadSafeQueue::Empty() const{
	std::lock_guard lk(mut_);
	return que_.empty();
}
上面代码只实现了关键的几个函数,并使用了C++11新引入的condition_variable条件变量。从Popup与Inert两个函数看std::unique_lock相对std::lock_guard更灵活的地方在于在等待中的线程如果在等待期间需要解锁mutex,并在之后重新将其锁定。而std::lock_guard却不具备这样的功能。

 

上面代码中

cond_.wait(lk, [this]{return !Empety();});
可能会比较难以理解,

 

[this]{return !Empety();}
是C++11新引入的功能,lambda表达式,是一种匿名函数。方括号内表示捕获变量。当lambda表达式返回true时(即queue不为空),wait函数会锁定mutex。当lambda表达式返回false时,wait函数会解锁mutex同时会将当前线程置于阻塞或等待状态。

还存在另一种读写锁,但是并没有引入C++11,但是boost库提供了对应的实现。读写锁主要适合在于共享数据更新频率较低,但是读取共享数据频率较高的场合

zabbix 监控EMC存储 经过搜索,找到了脚本地址,该项目应该是模板原作者创建的,该项目也有zabbix模板,和上面的应该是相同的,我用的是上面的模板。./unity_get_state.py --api_ip='X.X.X.X' --api_port='443' --api_user='zabbix' --api_password='PASSWORD' --storage_name="zabbix web前端配置的主机名" --discovery。修改权限,给zabbix用户执行权限,模板调用时以zabbix用户执行。 阅读详情

相关推荐

AutoLISP 学习 (一)

AutoLISP基本语法结构、语法 以括号组成表达式,左右括号一定要成对,单、双引号也要成对,例如: (defun c:hello() (princ "\nHello world!") (prin1) ) 表达式格式:(函数名 操作数 操作数 …),例如: (setq p1 (list 0 0)) (setq p2 (list 10 10)) (setq p3 (list 20 20)) ;;; CAD中画直线,经过p1 p2 p3 (command "LINE" p1 p2 p3 ""

m0_54575622的博客 2120

std::unique_lock 介绍

lock_guard 最大的缺点是简单,没有给程序员提供足够的灵活度,因此,C++11 标准中定义了另外一个与 Mutex RAII 相关类 unique_lock,该类与 lock_guard 类相似,也很方便线程对互斥量上锁,但它提供了更好的上锁和解锁控制。 顾名思义,unique_lock 对象以独占所有权的方式( unique owership)管理 mutex 对象的上锁和解锁操作,...

小米的修行之路 1万+

Amos实战:如何用Bootstrap法检验中介效应?附完整操作步骤

本文详细介绍了如何使用Amos软件通过Bootstrap法检验中介效应,包括模型设定、参数配置和结果解读。Bootstrap方法因其不依赖正态分布假设、统计功效高等优势,成为中介效应分析的首选方法。文章提供了完整的操作步骤和实用建议,帮助研究者准确评估变量间的中介作用机制。

zz67890的博客 1436

C++-std::unique_lock介绍和简单使用

unique_lock std::unique_lock比std::lock_guard更灵活,这种灵活性主要体现在以下几点: lock_guard在构造时或者构造前(std::adopt_lock)就已经获取互斥锁,并且在作用域内保持获取锁的状态,直到作用域结束;而unique_lock在构造时或者构造后(std::defer_lock)获取锁,在作用域范围内可以手动获取锁和释放锁,作用域结束时如果已经获取锁则自动释放锁。 lock_guard锁的持有只能在lock_guard对象的作用域范围内,作用域

mrbone11的博客 2万+

避开期货指标常见坑:文华财经赢顺DK多空指标优化配置指南(附参数调试技巧)

本文详细解析了文华财经赢顺DK多空指标的优化配置方法,帮助交易者避开常见使用误区。通过参数个性化适配、动态调整趋势阈值和过滤假信号的三重验证,提升指标在期货交易中的准确性。附有参数调试技巧和不同市况下的配置建议,适合中高级交易者参考。

weixin_29063979的博客 433

SAP FICO - 外币交易实战:汇率类型配置与货币换算率管理

月底关账前的外币评估就像财务人的"期末考",OB59配置就是你的备考方案。最低值原则(Lowest value principle)最保守。它会比较原始汇率与评估日汇率,取不利方向确认损失。适合风险厌恶型企业,我在制造业客户中应用最多。重估法(Revalue only)更反映市场现状。无论盈亏都按最新汇率调整,适合交易性金融资产处理。有个基金公司客户就靠这个方法及时反映了外汇波动收益。最小差异金额(Minimum difference)是防骚扰设置。

weixin_42524708的博客 355

std::unique_lock详解

std::unique_lock的作用与std::lock_guard基本相同,也是用于管理对互斥量的锁定与解锁,但更加的灵活。std::defer_lock的作用是延迟锁的获取,表示unique_lock初始时不要尝试获取锁,而是当调用lock或者try_lock成员函数时再获取锁。当使用了std::try_to_lock后,如果没有获得锁,std::unique_lock并不会阻塞当前的线程,可以去执行一些其他的操作,等一段时间后再尝试获取锁,或者返回通知我们获取锁失败,然后继续执行代码。

2301_78933228的博客 3156

功率半导体器件选型指南:从GTO、GTR到MOSFET、IGBT的原理与应用

功率半导体器件是电力电子系统的核心,如同电路中的智能开关,负责电能的转换与控制。其工作原理基于半导体材料的导电特性,通过控制信号精确管理电路的通断。这类器件的技术价值在于提升能效、减小体积并增强系统可靠性,广泛应用于变频器、逆变器、开关电源及新能源领域。理解不同器件如MOSFET的雪崩能量与IGBT的损耗计算,是进行高效、可靠电路设计的基础。本文聚焦于GTO、GTR、MOSFET和IGBT这四类经典全控型器件的特性对比与选型策略,帮助工程师在具体项目中做出经济可靠的选择。

cumo7370的博客 444

C++并发编程(5):std::unique_lock、互斥量所有权传递、锁的粒度

主要学习介绍C++并行编程的基础知识,做一些学习记录并分享

Solititude的博客 1483

Java实战:绿盾加密文件批量解密工具Ldterm的实现与优化

本文详细介绍了基于Java开发的绿盾加密文件批量解密工具Ldterm的实现与优化过程。通过分析绿盾加密机制,结合Java流处理能力,实现了高效的文件解密方案,并分享了多线程处理、内存优化等性能提升技巧,适用于企业级数据迁移与备份场景。

weixin_29314405的博客 487

ABP框架实战:从零搭建多租户应用(含完整代码示例)

本文详细介绍了如何使用ABP框架从零构建多租户SaaS应用,涵盖多租户架构设计、数据隔离实现、租户管理及性能优化等核心内容。通过完整的代码示例,帮助开发者快速掌握企业级数据隔离系统的开发技巧,提升SaaS应用开发效率。

weixin_29247219的博客 261

C++11 std::unique_lock与std::lock_guard的区别及多线程应用实例

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33824363的博客 106

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++11多线程 unique_lock详解

目录 1.unique_lock取代lock_guard 2. unique_lock的第二个参数 2.1 std::adopt_lock 2.2 std::try_to_lock 2.3 std::defer_lock 3. unique_lock的成员函数 3.1 lock(),加锁 3.2 unlock(),解锁 3.3 try_lock() 3.4 release() ...

u012507022的博客 8万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

多线程同步机制中 lock_guard 与 unique_lock 的使用区别

在 C++ 多线程编程中,同步机制是确保数据一致性和线程安全的关键。C++11 标准引入了两种新的锁定机制:`std::lock_guard` 和 `std::unique_lock`。这两种锁定器都用于自动管理互斥锁的生命周期,但它们在设计、使用方式和适用场景上存在一些重要的区别。本文将深入分析这两种锁定器的区别,并探讨它们在多线程同步机制中的使用。

dont worry about it的博客 1万+

C++中unique_lock和lock_guard区别

std::unique_lock 和 std::lock_guard 都属于标准库 <mutex> 中的互斥锁管理工具,用于简化互斥锁的使用并确保线程安全。但它们存在一些显著区别,std::lock_guard 适用于简单的锁定场景,追求简洁性和较低的性能开销;而 std::unique_lock 则适用于需要更复杂锁定逻辑、支持所有权转移的场景,但会带来一定的性能开销。

红军不怕远征难,万水千山只等闲 2190

c++ 11: lock_guard/unique_lock详解

std::mutex,最基本的 Mutex 类,提供基本互斥设施(类)。std::recursive_mutex,递归 Mutex 类,提供互斥设施,提供能被同一线程递归锁定的互斥设施(类)。std::timed_mutex,定时 Mutex 类,实现有时限锁定(类)。std::recursive_timed_mutex,定时递归 Mutex 类,提供能被同一线程递归锁定的互斥设施,并实现有时限锁定(类)。提供共享互斥设施(类)。, 提供共享互斥设施并实现有时限锁定。

qq_27898413的博客 1751

linux C++互斥锁std::lock_guard(轻锁)std::unique_lock(重锁)区别、使用{}来控制轻锁lock_guard的生命周期(lock_guard不支持手动解锁)

lock_guard 是基于互斥锁 std::mutex 实现的,unique_lock 是基于通用锁 std::unique_lock 实现的,unique_lock 可以实现比 lock_guard 更灵活的锁操作。但是,在某些情况下,可能需要手动释放互斥锁。它的使用方法很简单,只需要在代码中创建一个 std::lock_guard 对象,并传入一个互斥锁,在它的生命周期内,互斥锁的访问权限将被控制。std::lock_guard 是 C++11 中的标准库,是一个实现互斥锁的简单模板类。

Dontla的博客 8549

C++11之多线程: unique_lock详解

目录 1.unique_lock取代lock_guard 2. unique_lock的第二个参数 2.1 std::adopt_lock 2.2 std::try_to_lock 2.3 std::defer_lock 3. unique_lock的成员函数 3.1 lock(),加锁 3.2 unlock(),解锁 3.3 try_lock() 3.4 release() 4. unique_lock所有权的传递 1.unique_lock取代lock_guard uni.

随意的风的专栏 7133
上一篇: 基于C++11/14/17的线程池实现
下一篇: 浅析 C++ 之 RAII
imJaron
博客等级 码龄11年 121粉丝 286原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值