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;通过不…

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

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

【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; 不适应 从学校毕业&…

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

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

Redis篇----第十一篇

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

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

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

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

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

快速清理_卸载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;赛题难度比国赛略微简单…

Qt _day1

1.思维导图 2.设计一个简单登录界面 #include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {this->setWindowTitle("原神启动"); // this->setStyleSheet("background-color:rgb(255,184,64)");this->setStyl…

XSS攻击原理与解决方法

参考&#xff1a; web安全之XSS攻击原理及防范_xss攻击原理与解决方法-CSDN博客 跨站脚本攻击&#xff08;XSS)分类介绍及解决办法_反射型跨站脚本解决方案-CSDN博客 一、概述 XSS攻击是Web攻击中最常见的攻击方法之一&#xff0c;它是通过对网页注入可执行代码且成功地被浏…

【竞技宝】DOTA2-喀山:莫言帕克毁天灭地 IG让一追二力克Neon

北京时间2024年2月21日,喀山未来运动会DOTA2项目在昨天迎来第二个比赛日。本日第二轮第二场比赛由IG对阵Neon。本场比赛两队在前两局各取一胜,决胜局IG的防守反击多次击溃Neon,最终IG让一追二击败Neon。以下是本场比赛的详细战报。 第一局: 首局比赛,IG在天辉方,Neon在夜魇方。…

算法项目(2)—— LSTM、RNN、GRU(SE注意力)、卡尔曼轨迹预测

本文包含什么? 项目运行的方式(包教会)项目代码LSTM、RNN、GRU(SE注意力)、卡尔曼四种算法进行轨迹预测.各种效果图运行有问题? csdn上后台随时售后.项目说明 本文实现了三种深度学习算法加传统算法卡尔曼滤波进行轨迹预测, 预测效果图 首先看下不同模型的指标: 模型RM…

unity学习(33)——角色选取界面(原版)

10ARPG网络游戏编程实践&#xff08;十&#xff09;&#xff1a;角色选择UI及创建面板制作&#xff08;一&#xff09;&#xff08;流畅&#xff09;_哔哩哔哩_bilibili 角色选择界面教程中是这样的&#xff01;&#xff08;这个美工肯定是不能拿出去卖的&#xff0c;但是是有…

IP协议及相关技术协议

一、IP基本认识 1. IP的作用 IP在TCP/IP模型中处于网络层&#xff0c;网络层的主要作用是实现主机与主机之间的通信&#xff0c;而IP的作用是在复杂的网络环境中将数据包发送给最终目的主机。 2. IP与MAC的关系 简单而言&#xff0c;MAC的作用是实现“直连”的两个设备之通信…

77、Spring、Spring Boot和Spring Cloud的关系

77、Spring、Spring Boot和Spring Cloud的关系 随着 Spring、Spring Boot 和 Spring Cloud 的不断发展&#xff0c;越来越多的开发者加入 Spring 的大军中。对于初学者而言&#xff0c;可能不太了解 Spring、Spring Boot 和 Spring Cloud 这些概念以及它们之间的关系&#xff…

10个行锁、死锁案例⭐️24张加锁分析图彻底搞懂Innodb行锁加锁规则!

10个行锁、死锁案例⭐️24张加锁分析图&#x1f680;彻底搞懂Innodb行锁加锁规则&#xff01; 上篇文章 我们描述原子性与隔离性的实现&#xff0c;其中描述读操作解决隔离性问题的方案时还遗留了一个问题&#xff1a;写操作是如何解决不同的隔离性问题&#xff1f; 本篇文章…

linux CentOs 安装docker 推荐生产环境使用

目录 1. 在CentOs上安装docker所需的系统环境 2. 卸载旧版本 2.1 查看是否已安装docker 2.2 卸载已安装的docker 3. 安装方式 3.1 使用rpm存储库安装(推荐使用该方法) 3.2 从包中安装 4. 开始docker 1. 在CentOs上安装docker所需的系统环境 需要以下CentOS版本之一的维…