C++11多线程: mutex(互斥元)

文章目录

  • mutex(互斥元)
    • 案例 1
    • 案例2
  • lock_guard()
    • 案例2的优化

由C++标准提供的保护共享数据的最基本机制是:互斥元 (mutex 全称为: mutual exclusive
在访问共享数据前, 锁定lock)与该数据相关的互斥元,当访问数据结构完成后, 解锁unlock)该互斥元。线程库一旦一个线程已经锁定某个互斥元,所有其他试图锁定相同互斥元的线程都必须等待,直到成功锁定了该互斥元的线程解锁此互斥元。
互斥元是C++中最常见的数据保护机制。
在C++中,通过构造std::mutex的实例创建互斥元,调用成员函数lock()来锁定它,调用成员函数unlock()来解锁它。

mutex(互斥元)

案例 1

线程对象th1通过传入的线程函数print_block,打印50个*
线程对象th2通过传入的线程函数print_block,打印50个$

#include <iostream>
#include <mutex>
# include<thread>
using namespace std;mutex mtx; // mutex for critical sectionvoid print_block( int n, char c) {// critical section (exclusive access to std::cout signaled by locking mtx):mtx.lock();//加锁for( int i = 0; i<n; ++i) { std:: cout<< c; }std:: cout<< '\n';mtx.unlock();//释放锁
}int main(int argc, char *argv[])
{	std::thread th1(print_block, 50, '*');std::thread th2(print_block, 50, '$');th1.join();th2.join();return 0;
}

在这里插入图片描述
在这里插入图片描述

案例2

线程th1和线程th2,都通过传入的线程函数print_global_var,分别对全局变量a,进行自增20次。

#include <iostream>
#include <mutex>
#include<thread>
using namespace std;int a = 0;
void print_global_var(){for(int i=0; i<20; i++){mtx.lock();//加锁thread::id tid = this_thread::get_id();a++;cout << "tid:" << tid << " a:" << a << endl;mtx.unlock();//解锁}}
int main(int argc, char *argv[])
{	std::thread th1(print_global_var);std::thread th2(print_global_var);th1.join();th2.join();return 0;
}

critical section: 指的是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。就是指的加锁和解锁之间的那段代码。
在这里插入图片描述
在这里插入图片描述

lock_guard()

在C++中,通过构造std::mutex的实例创建互斥元,调用成员函数lock()来锁定它,调用成员函数unlock()来解锁它。
然而,直接调用成员函数是不推荐的做法,因为这意味着你必须记住在离开函数的每条代码路径上都调用unlock(),包括由于异常所导致的在内。
作为替代,标准C++库提供了std::lock_guard类模板,实现了互斥元的RAII惯用语法;它在构造时锁定所给的互斥元在析构时将互斥元解锁,从而保证被锁定的互斥元始终被正确解锁。

案例2的优化

#include <iostream>
#include <mutex>
# include<thread>
using namespace std;
mutex mtx; // mutex for critical sectionint a = 0;
void print_global_var(){for(int i=0; i<20; i++){lock_guard<mutex> guard(mtx);//在构造guard对象时锁定所给的互斥元,在析构guard对象时将互斥元解锁//mtx.lock();//加锁thread::id tid = this_thread::get_id();a++;cout << "tid:" << tid << " a:" << a << endl;//mtx.unlock();//解锁}}int main(int argc, char *argv[])
{	std::thread th1(print_global_var);std::thread th2(print_global_var);th1.join();th2.join();return 0;
}

在这里插入图片描述

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

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

相关文章

Aspose.Words For JAVA 动态制作多维度表格(涵2024最新无水印包)

全网最全Aspose.Words For JAVA 高级使用教程: CSDNhttps://blog.csdn.net/LiHaoHang6/article/details/133989664?spm1001.2014.3001.5501 运行截图&#xff1a; 所谓多维度表格通常包含多个维度, 每个维度都代表一种数据属性,多维度表格可以用于数据分析&#xff0c;通过不…

java后端比较同类的两个对象的字段差异的项目内的三种实现的比较

文章目录 前言一、示例1-OriginalUtils (不推荐)二、示例2-ExtendBeanComparer(不推荐)三、示例3-NativeBeanComparer(推荐)四、调试示例1.代码调试方法2.调试日志信息(印证了示例3的推荐结论)前言 项目内有个需求,对导入的数据行,通过流程将数据下发到具体的业务人…

怎么使用Git进行版本恢复

场景 在实际工作过程中&#xff0c;有时候会出现以下问题&#xff1a; 1.在使用git对代码进行远程仓库托管时&#xff0c;会出现误操作&#xff0c;怎么恢复上一个版本或指定历史版本&#xff1f; 2.git 误操作&#xff0c;将代码提交到 master 主分支&#xff0c;怎么恢复 …

【洛谷 P8780】[蓝桥杯 2022 省 B] 刷题统计 题解(贪心算法+模拟+四则运算)

[蓝桥杯 2022 省 B] 刷题统计 题目描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天做 a a a 道题目&#xff0c;周六和周日每天做 b b b 道题目。请你帮小明计算&#xff0c;按照计划他将在第几天实现做题数大于等于 n n n 题? 输入格式 输入一…

tidb流式读取配置

程序中执行会话变量(显示数据速度)&#xff1a;--后是tidb默认值。 配合流式读取&#xff0c;作如下读取速度限制&#xff0c; 限制fullscan&index速度&#xff1a; 以下是在java中的示例&#xff0c;com.adata.common.tidb.read.是java包类名&#xff1a; com.adata.c…

模拟输入框

span 支持换行输入 <body>阿的<span contenteditable"true">大大</span>发送到发送到发多少分 </body>div <body><div contenteditable"true">大大</div> </body>

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora&#xff1f;工作原理&#xff1a;算法原理&#xff1a;应用场景展望与其他视频生成模型相比有哪些优势和不足&#xff1f;优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易…

数据仓库概念梳理

数据仓库&#xff08;英语&#xff1a;Data Warehouse&#xff0c;简称数仓、DW&#xff09;,是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境&#xff0c;为企业提供决策支持&#xff08;Decision Support&#xff09;。 数据仓库是分析…

初入职场的你,为何频繁跳槽?

大数据统计&#xff0c;初入职场的人跳槽频率相当高&#xff0c;而对于工作了2~3年的来说&#xff0c;跳槽频率也就没有那么频繁了&#xff0c;是什么原因导致了频繁跳槽&#xff1f;如何避免频繁跳槽呢&#xff1f; 是什么原因导致了跳槽&#xff1f; 不适应 从学校毕业&…

JS-异步编程-MDN文档学习笔记

异步JS 查看更多学习笔记&#xff1a;GitHub&#xff1a;LoveEmiliaForever MDN中文官网 异步编程简介 异步编程赋予程序如下特性 通过调用一个函数来启动一个长期运行的操作让函数开始操作并立即返回&#xff0c;这样我们的程序就可以保持对其他事件做出反应的能力当操作最…

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

2.Swift Tabbar的使用

Swift Tabbar的使用 在 Swift 中使用 UITabBarController 来创建一个具有选项卡界面的应用程序。下面是一个简单的示例&#xff0c;演示如何在 Swift 中使用 UITabBarController&#xff1a; import UIKitclass RootTabbar: UITabBarController {override func viewDidLoad()…

Redis篇----第十一篇

系列文章目录 文章目录 系列文章目录前言一、Redis 如何做内存优化?二、Redis 回收进程如何工作的?三、都有哪些办法可以降低 Redis 的内存使用情况呢?四、Redis 的内存用完了会发生什么?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

【前端素材】推荐优质后台管理系统Symox模板(适用电商,附带源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

LeetCode209长度最小子数组

参考链接&#xff1a;209.长度最小的子数组 注意&#xff1a;本题的子数组是连续的&#xff0c;一串一串的 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int i,j,minDis99999999;int sum0;//j控制子数组末尾&#xff0c;i控制子数…

gentoo安装笔记

最近比较闲&#xff0c;所以挑战一下自己&#xff0c;在自己的台式电脑上安装gentoo 下面记录了我亲自安装的步骤&#xff0c;作为以后我再次安装时参考所用。 整体步骤 一般来将一个linux发行版的安装步骤其实大体上都差不多&#xff0c;基本分为一下几步&#xff1a; 1. …

【算法与数据结构】1020、LeetCode飞地的数量

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复杂…

RisingWave分布式SQL流处理数据库调研

概述 RisingWave是一款分布式SQL流处理数据库&#xff0c;旨在帮助用户降低实时应用的的开发成本。作为专为云上分布式流处理而设计的系统&#xff0c;RisingWave为用户提供了与PostgreSQL类似的使用体验&#xff0c;官方宣称具备比Flink高出10倍的性能&#xff08;指throughp…

快速清理_卸载docker_找到不用的进程_centos磁盘爆满_清理磁盘---Linux工作笔记071

查看大文件,并且按照大小排名 cd / | du -h |sort -hr|head -30 可以看到根据不用的结果进行删除 可以看到在/data/dict目录很大,里面的都可以删除 然后再去卸载docker,要不然,没有磁盘是卸载不了的 systemctl stop docker systemctl stop docker.socket yum remove docker-…

【2024上半年数学建模推荐】2024年第九届数维杯大学生数学建模挑战赛报名通知

2024上半年数模人必打的数学建模竞赛&#xff1a;数维杯全国大学生数学建模挑战赛已经开始报名。 赛题难度&#xff1a;四颗星 含金量&#xff1a;国家级二类 参赛对象&#xff1a;在校专科、本科、研究生 推荐理由&#xff1a;获奖率高&#xff0c;赛题难度比国赛略微简单…