C++ STL的锁介绍

news/2024/5/19 21:53:49

在 C++ Standard Template Library (STL) 中,有几个锁的实现,这些都位于 <mutex> 头文件。以下是一些常见的锁及其功能:

  1. std::mutex:最基本的互斥锁,不可递归使用。该锁提供了独占的非公平锁定能力。
std::mutex mtx;
mtx.lock();   // 获取锁
// 临界区代码
mtx.unlock(); // 释放锁
  1. std::recursive_mutex:递归互斥锁,允许同一个线程对同一个互斥体多次上锁。
std::recursive_mutex rmtx;
rmtx.lock();   // 第一次锁定
rmtx.lock();   // 第二次锁定,该线程不会被阻塞
// 临界区代码
rmtx.unlock(); // 第一次解锁
rmtx.unlock(); // 第二次解锁
  1. std::timed_mutex:带有超时功能的互斥锁,允许尝试上锁一段时间。
std::timed_mutex tmtx;
if (tmtx.try_lock_for(std::chrono::seconds(1))) {// 获取锁tmtx.unlock();
}
  1. std::recursive_timed_mutex:递归和带有超时的互斥锁。
std::recursive_timed_mutex rtmtx;
if (rtmtx.try_lock_for(std::chrono::seconds(1))) {// 获取锁rtmtx.unlock();
}
  1. std::lock_guard:是 RAII(Resource Acquisition Is Initialization)风格的包裹器,确保锁在作用域中被安全的获取和释放。
std::mutex mtx;
{std::lock_guard<std::mutex> lock(mtx);// 临界区代码
} // lock 自动释放
  1. std::unique_lock:比 std::lock_guard 更为灵活,允许延迟锁定、时间锁定、重复锁定和解锁和转移锁所有权等。
std::mutex mtx;
std::unique_lock<std::mutex> ulock(mtx, std::defer_lock); // 延迟锁定
ulock.lock();   // 显示调用锁定
// 临界区代码
ulock.unlock(); // 如果需要可以提前解锁
  1. std::shared_mutex(C++17 引入):读写锁,支持多个读者(共享锁)或单一写者(独占锁)。
std::shared_mutex smtx;
{std::shared_lock<std::shared_mutex> lock(smtx); // 共享锁// 多个线程可以同时读取数据(非临界区代码)
} // 共享锁自动释放{std::unique_lock<std::shared_mutex> lock(smtx); // 独占锁// 临界区代码,只有一个线程可以写数据
} // 独占锁自动释放

这些锁提供了多种不同线程同步和互斥的机制,以解决多线程程序中的竞态条件和其他同步问题。开发者可以根据不同的需要选择合适的锁使用。


http://www.mrgr.cn/p/82541312

相关文章

MMU(内存管理单元)

内存管理单元(MMU) MMU的概念 MMU是一种硬件设备,也称为内存管理单元,它位于计算机系统的中央处理器(CPU)和内存之间,负责处理中央处理器(CPU)的内存访问请求,将实现对虚拟地址到物理地址的转换(即虚拟内存管理)、内存保护、中央处理器高速缓存的控制,而在较为简单…

###什么是Linux内核###什么是MMU

什么是Linux内核 Linux 内核简介 Linux 内核是 Linux 操作系统(OS)的主要组件,也是计算机硬件与其进程之间的核心接口。它负责两者之间的通信,还要尽可能高效地管理资源。 之所以称为内核,是因为在操作系统中就像果实硬壳中的种子一样,控制着硬件(无论是电话、笔记本电脑…

08 - 条件判断语句

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 条件判断语句2. 语法说明3. 经验4. 代码 1. 条件判断语句 makefile 中支持条件判断语句 可以根据条件的值来决定 make 的执行可以比较两个不同变量或者变量和常量的值 注&#xff1a;条件判断语句只能用于控制 make 实际执行的…

鸿蒙HarmonyOS实战-ArkUI事件(焦点事件)

🚀前言 焦点事件是指程序中的重要事件或关键点。焦点事件通常是程序的核心逻辑和功能,需要引起特殊的关注和处理。 在图形用户界面(GUI)编程中,焦点事件通常与用户交互和界面输入相关。例如,当用户点击按钮、输入文本或选择菜单项时,这些操作会触发相应的焦点事件。程序需…

页面嵌套,界面套娃,除了用iframe,还有其他方式吗?

​UIOTOS可以了解下,uiotos.net,通过连线来代替脚本逻辑开发,复杂的交互界面,通过页面嵌套轻松解决,是个很新颖的思路,前端零代码! 蓝图连线尤其是独创的页面嵌套和属性继承技术,好家伙相当于把vue的组件化、增量式面向对象开发,直接搬到前端拖拽工具上,无代码编程了…

SwiftUI ZStack、HStack、VStack 布局

代码 // // ContentView.swift // SwiftUIStacks // // Created by CHEN Hao on 2024/5/6. //import SwiftUIstruct ContentView: View {var body: some View {VStack(spacing:15) {HeaderView()HStack(spacing: 15) {PricingView(title: "Basic", price: "$…

特征提取(Feature Extraction)常见统计特征笔记(三)

统计特征是描述数据集中值的一组量&#xff0c;通常用于了解数据的分布、集中趋势和变异程度。常见的统计特征包括均值、中位数、众数、标准差、方差等。下面会详细解释每个统计特征&#xff0c;并给出相应的Python代码。 1、均值&#xff08;Mean&#xff09;&#xff1a;所有…

[智能网联汽车] 解读理想汽车的整车EEA电子电气架构 | 2020 [转]

0 序本文首发于华夏EV网、2020年。时至今日,这篇文章虽已过去了2年,今天的我们,对了解当前整车电子电气架构(EEA)的技术演进仍有一定的参考意义。 关键词:整车电子电气架构(EEA) 分布式架构 域集中式架构 中央集中式架构中央计算平台(CCU)导读 2020年,当我们谈论整车电子电…

DeepFilterNet复现

大概框架 有两路特征,一个ERB特征,另外一个是STFT之后的复数特征。 整体时延最低可达5ms。 这里提到的DeepFilter,其实就是说用神经网络对TF谱进行操作。因为这篇文章比较早,所以叫这么一个名字。ERB特征 ERB(Equivalent Rectangular Bandwidth)是一个与人耳听觉敏感性密…

geojson文件规格

geojson文件示例&#xff0c; {"type": "FeatureCollection","features": [{"type": "Feature","geometry": {"type": "Point","coordinates": [102.0, 0.5]},"properties&q…

【负载均衡在线OJ项目日记】项目简介

目录 前言 什么是负载均衡 所用的技术和开发环境 所用技术 开发环境 项目的宏观结构 leetcode 结构 结构 编写思路 前言 从C语言的文章到现在Linux网络部分&#xff0c;我已经涉猎了很多知识&#xff1b;终于在今天我要开始搞项目了&#xff0c;通过项目我也可以开始…

使用 docker-compose 部署 nexus

本篇博客主要介绍如何通过 docker-compose 快速搭建 nexus 服务,毕竟目前采用容器化部署是一件更加快速轻松的方案。 之前的博客已经介绍过 nexus 的搭建,以及为 IDEA 和 Visual Studio 提供代理服务,这里就不详细介绍了,提供出之前博客的链接。 nexus 在 windows 上的搭建…

简述Linux系统内核的作用

本文简述了Linux内核的5个子系统:进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)V 1.0 2024年5月7日 发布于博客园目录Linux内核的组成部分进程调度(SCHED)内存管理(MM)虚拟文件系统(VFS)网络接口(NET)进程间通信(IPC…

vue 实现项目进度甘特图

项目需求&#xff1a; 实现以1天、7天、30天为周期&#xff08;周期根据筛选条件选择&#xff09;&#xff0c;展示每个项目不同里程碑任务进度。 项目在Vue-Gantt-chart: 使用Vue做数据控制的Gantt图表基础上进行了改造。 有需要的小伙伴也可以直接引入插件&#xff0c;自己…

Linux下GraspNet复现流程

Linux&#xff0c;Ubuntu中GraspNet复现流程 文章目录 Linux&#xff0c;Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference &#x1f680;非常重要的环境配置&#x1f680; ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…

Spring SpringMVC概述

SpringMVC框架主要用于跟客户端交互,包括请求和响应。前端控制器的作用就是把一些功能封装,我们在开发时就不用再写一些繁杂的代码了 SpringMVC使用DispatcherServlet作为前端控制器,DispatcherServlet本质其实是一个Servlet原先我们在访问时,客户端发起请求直接找Servlet。…

做题速度太慢了,面不上

没办法&#xff0c;之前练了一个月的sql。两个月不写&#xff0c;现在差不多忘干净了。工作空窗期&#xff0c;或者休息期不能太久&#xff0c;不然学再多的内容都可能会忘完的。 sql题&#xff0c;腾讯四道sql题&#xff0c;限时45分钟完成。我只做了一道&#xff0c;还没做完…

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next()&#xff1a;此方法遇见第一个有效字符…

物流行业新篇章:数字孪生系统助力仓储物流园区升级

在数字化浪潮的推动下,物流行业正迎来前所未有的变革,现代化仓储物流园区数字孪生系统正以其独特的魅力引领着物流行业迈向更加智能、高效的新时代。在数字化浪潮的推动下,物流行业正迎来前所未有的变革,现代化仓储物流园区数字孪生系统正以其独特的魅力引领着物流行业迈向…

IO一些基础必备知识点

IO编程 IO一些必备知识点 目录IO编程IO一些必备知识点①了解FAT32以及NTFS区别②了解MMU如何将虚拟地址与物理地址转换③请简述Linux内核的作用Linux内核是链接硬件和上层应用的桥梁,通过这个桥梁我们可以直接在上层完成对硬件的操作④Linux系统目录和文件夹的区别⑤库函数与系…