当前位置: 首页 > news >正文

C++中的互斥量

互斥量是一个类,互斥量的使用必须引入头文件#include <mutex>。互斥量就如同一把锁,在同一时间,多个线程都可以调用lock成员函数尝试给这把锁头加锁,但是只有一个线程可以成功给这把锁加锁,其他没有加锁成功的线程的执行流程就会卡在lock语句行这里不断地尝试去加锁,一直到加锁成功,执行流程才会继续走下去。

互斥量的使用:

#include <mutex>
#include <iostream>
#include <thread>
using namespace std;mutex  my_mutex; // 这是一个互斥量,锁头
int sum = 0; // 这是需要保护的变量
void test() {cout << "test is exceuteing by thread id:" << this_thread::get_id() << endl;my_mutex.lock(); // 加锁,确保在同一时刻只有一个线程在修改sum变量,没有加锁成功的线程就会卡在这里,不断尝试去解锁,直到解锁成功,然后再继续执行下去。cout << "exeuteing by "<< this_thread::get_id() << endl;sum += 1;my_mutex.unlock(); // 解锁,对sum变量操作完成后,就解锁,让其他线程可以调用lock函数加锁。cout << "exection is done by" << this_thread::get_id() << endl;
}int main(){cout << "Main thread id: " << this_thread::get_id() << endl;test();thread th1(test);thread th2(test);thread th3(test);thread th4(test);thread th5(test);th1.join();th2.join();th3.join();th4.join();th5.join();cout << "sum is " << sum << endl;return 0;}

sum变量是我们想要保护的对象,因为多个线程对sum进行加1时,如果在同一时刻,多个线程同时修改sum变量,那么最终得到的累加结果就有可能是错的。因此会我们可以对sum的操作进行加锁保护,让在同一时刻只有一个线程在操作累加的动作。

锁的范围不宜过大,过大会降低程序的运行性能。当然太小也不行,这可能会导致不能够切实保护到我们想保护的代码块。在lock 与unlock之间的代码块都会受到这把锁的保护。

另外使用锁机制来解决线程之间的协作问题时,一定要小心,避免出现死锁。上面的例子中使用一把锁还是比较简单,当多把锁一起使用时,就可能会因为思考不周导致死锁出现。

关于锁的更多使用可以翻阅lock_guard,unique_lock使用。

http://www.lryc.cn/news/301644.html

相关文章:

  • 盲盒小程序开发
  • 安装 Windows 10
  • C++文件操作->文本文件(->写文件、读文件)、二进制文件(->写文件、读文件)
  • Mac相关问题
  • Python爬虫之Splash详解
  • Deep深度系统下载安装Beyond compare4
  • Qt 使用QScintilla 编辑lua 脚本
  • 2022长安杯复现
  • Netty Review - NioEventLoopGroup源码解析
  • 团队配置管理规范浅见
  • 「算法」二分查找1:理论细节
  • 【网络安全】什么样的人适合学?该怎么学?
  • 从零开始学习数据结构—【链表】—【探索环形链的设计之美】
  • AJAX——HTTP协议
  • java面试微服务篇
  • JS进阶——垃圾回收机制以及算法
  • 【快速解决】python项目打包成exe文件——vscode软件
  • 数据结构——lesson3单链表介绍及实现
  • 中科大计网学习记录笔记(八):FTP | EMail
  • QPaint绘制自定义坐标轴组件00
  • MATLAB|基于改进二进制粒子群算法的含需求响应机组组合问题研究(含文献和源码)
  • JDBC核心技术
  • 【天幕系列 02】开源力量:揭示开源软件如何成为技术演进与社会发展的引擎
  • “挖矿”系列:细说Python、conda 和 pip 之间的关系
  • 【自然语言处理】实验3,文本情感分析
  • 2.12日学习打卡----初学RocketMQ(三)
  • <网络安全>《35 网络攻防专业课<第一课 - 网络攻防准备>》
  • 【实战】一、Jest 前端自动化测试框架基础入门(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)
  • 蓝桥杯Java组备赛(二)
  • 人力资源智能化管理项目(day10:首页开发以及上线部署)