C++11/14/17中提供的mutex系列区别

C++11/14/17中提供的mutex系列类型如下:

互斥量

C++版本

作用

mutex

C++11

基本的互斥量

timed_mutex

C++11

timed_mutex带超时功能。在规定的等待时间内,没有获取锁,线程不会一直阻塞,代码会继续执行

recursive_mutex

C++11

递归锁,允许在同一个线程中同一个互斥量多次被 lock() ,用于可能被连续多次上锁(期间未解锁)的情况,效率要比mutex低

std::mutex 及其变种不允许同一个线程对互斥量多次上锁,而 std::recursive_mutex 则允许

recursive_timed_mutex

C++11

带超时的,递归的,独占互斥量,允许同一个线程,同一个互斥量,多次被lock,用法和非递归的一样

shared_timed_mutex

C++14

具有超时机制的可共享互斥量

shared_mutex

C++17

shared_mutex的弟弟曾实现是操作系统提供的读写锁,在多线程对共享资源读且少许县城对共享资源写的情况下,shared_mutex比mutex效率更高

写锁(排它锁):lock/unlock

读锁(共享锁):lock_shared/unlock_shared

以上系列的对象都提供了加锁(lock)、尝试加锁(try_lock)和解锁(unlock)方法。

为了避免死锁,std::mutex.lock方法和std:mutex.unlock方法需要成对使用,如果一个函数中有很多出口,而互斥体对象又是需要在整个面数作用域被保护的资源,那么我们在编码时会因为忘记在某个出口处调用std::mutex.unlock 而造成死锁。这时可以通过RAII技术封装这两个接口,C++新标准也提为我们提供了类似的封装:

互斥量管理

C++版本

作用

lock_guard

C++11

基于作用于的互斥量管理,在需要对资源进行保护的小范围作用域内,应首先考虑使用std::lock_guard

unique_lock

C++11

unique_lock 是 lock_guard 的升级加强版,一个通用的互斥量锁定包装器,它允许延迟锁定,限时深度锁定,递归锁定,锁定所有权的转移以及与条件变量一起使用。

shared_lock

C++14

shared_lock可用于保护共享数据不被多个线程同时访问

unique_lock专门管理“独占模式”,而shared_lock专门管理“共享模式”

scoped_lock

C++17

如果有多个mutex要同时lock,用scoped_lock。如果只要lock一个mutex,可以用lock_guard

如std::lock_guard:

void func()
{std::lock quard<std:nutex> quard(mymutex);//在这里放被保护的资源操作
}

mymutex 的类型是std:mutex,guard对象的构造函数会自动调用mymutex.lock 方法对 mymutex 进行加锁,在 guard 对象出了其作用域时,guard对象的析构函数会自动调用 mymutex.unlock 方法对 mymutex 进行解锁,简单来说:根据 RAII原则,在构造函数中上锁(创建即上锁),在析构函数中解锁(销毁即解锁)。需要注意的是:mymutex 生命周期必须长于func 函数的作用域。

多线程使用锁经验总结:

  1. 减少锁的使用次数,能不用锁尽量不用;
  2. 明确锁的范围;
  3. 减少锁的使用粒度,尽量减少锁的作用的临界区代码范围。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity环境下实现Camera高帧率RTMP推送

Unity下RTMP直播背景方面不再赘述&#xff0c;今天主要讨论的是&#xff0c;Unity环境下&#xff0c;如何实现Camera高帧率RTMP推送&#xff0c;这里提到的高帧率&#xff0c;不再局限于常规环境下的30帧&#xff0c;以VR头显为例&#xff0c;更高的帧率&#xff08;比如50帧&a…

Outlook2010怎么关联邮箱 Outlook邮箱关联的教程

Outlook想要关联自己的邮箱&#xff0c;该怎么关联呢?下面我们就来看看详细的教程。 1、首先我们登录进入我们的Outlook&#xff0c;点击文件-添加账户 Outlook2010怎么关联邮箱? Outlook邮箱关联的教程 2、之后进入我们的添加账户导航&#xff0c;选择第一个电子邮件 Ou…

如何在Android平台GB28181接入终端实现语音广播和语音对讲

技术背景 在之前的blog&#xff0c;我们以Android平台国标接入终端为例&#xff0c;分别介绍了一些常规的功能&#xff0c;比如REGISTER、CATALOG、INVITE、Keepalive、SUBSCRIBE、NOTIFY等常规操作&#xff0c;今天主要介绍下语音广播和语音对讲这部分。 GB28181平台广播和对…

Android GB28181设备接入端语音广播和语音对讲技术实现探究

上篇文章提到Android端GB28181接入端的语音广播和语音对讲的实现&#xff0c;从spec角度大概介绍了下流程和简单的接口设计&#xff0c;好多开发者私信我&#xff0c;希望展开说一下。其实这块难度不大&#xff0c;只是广播和对讲涉及到双向实现&#xff0c;如果之前没有相关的…

微信公众号页面模版怎么添加文章推荐功能

微信公众号中发布的文章可以添加推荐的文章&#xff0c;该怎么添加文章推荐功能呢?下面我们就来看看详细的教程。 微信公众号页面模版怎么添加文章推荐功能? 1、登录微信公众平台&#xff0c;选择“功能”——“页面模板”——“添加模板” 微信公众号页面模版怎么添加文章…

Android native层实现MediaCodec编码H264/HEVC

Android平台在上层实现mediacodec的编码&#xff0c;资料泛滥&#xff0c;已经不再是难事&#xff0c;今天给大家介绍下&#xff0c;如何在Android native层实现MediaCodec编码H264/HEVC&#xff0c;网上千篇一律的接口说明&#xff0c;这里不再赘述&#xff0c;本文主要介绍下…

edge浏览器运行不流畅怎么办 提高edge浏览器速度的方法

edge浏览器是win10系统的专用浏览器&#xff0c;它代替了慢吞吞的IE&#xff0c;很多人觉得edge浏览器运行速度快&#xff0c;但是有时候浏览某些网站的时候会不流畅&#xff0c;所以怎么提高edge浏览器的运行速度呢&#xff0c;小编就来教教大家。 1、打开Edge浏览器后&#…

GB/T 28181联网系统通信协议结构和技术实现

技术回顾 在本文开头&#xff0c;我们先一起回顾下GB/T28181联网系统通信协议结构&#xff1a; 联网系统在进行视音频传输及控制时应建立两个传输通道&#xff1a;会话通道和媒体流通道。 会话通道用于在设备之间建立会话并传输系统控制命令&#xff1b;媒体流通道用于传输视…

Android平台GB28181设备接入端对接编码前后音视频源类型浅析

前言 今天主要对Android平台GB28181设备接入模块支持的接入数据类型&#xff0c;做个简单的汇总&#xff1a; 编码前数据&#xff08;目前支持的有YV12/NV21/NV12/I420/RGB24/RGBA32/RGB565等数据类型&#xff09;&#xff0c;其中&#xff0c;Android平台前后摄像头数据&…

搜狗高速浏览器怎么设置页面字体 设置方法介绍

搜狗高速浏览器是由搜狗公司开发的一款浏览器应用&#xff0c;我们在使用电脑或者手机等设备时都是离不开浏览器应用的&#xff0c;并且在很多浏览器中有的功能都是可以根据用户的使用习惯和喜好来设置的&#xff0c;就比如页面字体&#xff0c;所以小编今天就来跟大家分享一下…

C++学习之-析构函数必须为虚函数吗?

今天讨论个比较有意思的话题&#xff1a;析构函数是不是必须要为虚函数&#xff1f; 先说答案&#xff1a; 析构函数可以是虚函数&#xff0c;也可以不是虚函数。 再说原因&#xff1a; 析构函数为虚函数的情况&#xff1a;继承 当父类指针释放子类对象时&#xff0c;如果…

如何实现RTMP或RTSP播放端回调YUV/RGB数据?

今天某乎收到个问题推荐&#xff0c;如何实现RTSP回调YUV数据&#xff0c;用于二次处理&#xff1f; 正好前些年我们做RTSP和RTMP直播播放的时候&#xff0c;实现过相关的需求&#xff0c;本文就以Android为例&#xff0c;大概说说具体实现吧。 先说回调yuv或rgb这块意义吧&a…

Win7系统打印机删除不掉的解决方法

在Win7系统下&#xff0c;如果想要把安装的打印机删除&#xff0c;通常会在设备和打印机里删除打印机图标&#xff0c;但是一些用户反馈&#xff0c;用户在删除了打印机之后&#xff0c;只要一刷新打印机又会重新出现&#xff0c;感觉是删除不了&#xff0c;那么Win7系统打印机…

GB/T28181-2016传输要求和Android平台设备接入技术实现

相关协议规范 GB/T28181-2016公共安全视频监控联网系统 信息传输、交换、控制技术要求相关的传输要求如下&#xff1a; 5.1 网络传输协议要求 联网系统网络层应支持IP协议,传输层应支持 TCP和 UDP协议。 5.2 媒体传输协议要求 视音频流在基于IP的网络上传输时应支持 RTP/R…

无法打开Win11系统小组件怎么办

Win11操作系统也推出一段时间了&#xff0c;不少小伙都有下载体验&#xff0c;Win11与之前的Win10比较起来改动非常大&#xff0c;小组件是Win11系统中全新添加的功能&#xff0c;他类似于Win10最新的加入的兴趣模块&#xff0c;但是有朋友遇到了小组件无法打开的情况这是怎么回…

GB28181控制、传输流程和协议接口之注册|注销和技术实现

注册和注销基本要求 SIP客户端、网关、SIP设备、联网系统等 SIP代理(SIP UA)使用IETFRFC3261中定义的方法 15 GB/T28181—2016Register进行注册和注销。 注册和注销时应进行认证&#xff0c;认证方式应支持数字摘要认证方式&#xff0c;高安全级别的宜支持数字证书的认证方式&…

Edge浏览器网页怎么收藏 Edge浏览器网页收藏图文教程

Edge浏览器是微软最新推出的网页浏览工具。而现在有很多Edge浏览器新用户可能对它不是很了解&#xff0c;在使用过程中会出现小问题。今天小编就为大家解答Edge浏览器网页怎么收藏&#xff0c;一起来看教程吧! Edge浏览器网页收藏图文教程 一、怎么收藏网页? 1、打开Edge浏…

GB28181状态信息报送解读及Android端国标设备接入技术实现

今天主要聊聊GB/T28181状态信息报送这块&#xff0c;先回顾下协议规范相关细节&#xff0c;然后再针对代码实现&#xff0c;做个简单的说明。 状态消息报送基本要求 当源设备(包括网关、SIP设备、SIP客户端或联网系统)发现工作异常时,应立即向本 SIP监控域 的SIP服务器发送状…

IE浏览器怎么设置兼容性 添加兼容站点方法

IE浏览器是我们工作和生活中应用最广泛的浏览器&#xff0c;其安全、便捷是它的特点之一。不过这个浏览器在浏览部分网页的时候&#xff0c;会出现图片不刷新的情况&#xff0c;今天小编就带来了解决方法&#xff0c;告诉大家IE浏览器怎么设置兼容性。 1、首先点击IE浏览器右上…

GB28181设备接入端如何实现校时?

在探讨这个问题之前&#xff0c;我们先看看GB/T28181-2016官方文档怎么说的&#xff0c;9.10.1章节校时基本要求提到&#xff1a; 联网内设备支持基于SIP方式或 NTP方式的网络校时功能&#xff0c;标准时间为北京时间。 SIP方式校时见本节具体描述&#xff1b;NTP(见IETFRFC2…