C++多线程中互斥量std::mutex与模板类std::lock_guard
一、 互斥量std::mutex
C++中通过实例化std::mutex创建互斥量实例,通过成员函数lock()对互斥量上锁,unlock()进行解锁。C++中与std::mutex相关的类(包括锁类型)和函数都声明在< mutex >头文件中,要使用std::mutex,就必须包含此头文件。
#include <mutex>
#include <thread>
#include <iostream>int counter = 0;
std::mutex mtx; // 创建互斥量void add()
{for (int i = 0; i < 1000000; i++){mtx.lock(); // 加锁counter = counter + 1;mtx.unlock(); // 解锁}
}void sub()
{for (int i = 0; i < 1000000; i++){mtx.lock(); // 加锁counter = counter - 1;mtx.unlock(); // 解锁}
}int main()
{std::thread t1(add);std::thread t2(sub);t1.join();t2.join();std::cout << "counter:\t" << counter << std::endl;
}
二、 模板类std::lock_guard
不过,实践中不推荐直接去调用成员函数,调用成员函数就意味着,必须在每个函数出口都要去调用unlock(),也包括异常的情况。C++标准库为互斥量提供了一个RAII语法的模板类std::lock_guard,在构造时就能提供已锁的互斥量,并在析构的时候进行解锁,从而保证了一个已锁互斥量能被正确解锁。下面的程序清单中,展示了如何在多线程应用中,使用std::mutex构造的std::lock_guard实例,对一个共享数据访问保护。std::mutex和std::lock_guard都在 < mutex >头文件中声明。
#include <mutex>
#include <thread>
#include <iostream>int counter = 0;
std::mutex mtx; // 创建互斥量void add()
{for (int i = 0; i < 1000000; i++){std::lock_guard<std::mutex> lock(mtx); // 析构,自动解锁。counter = counter + 1;}
}void sub()
{for (int i = 0; i < 1000000; i++){std::lock_guard<std::mutex> lock(mtx); // 析构,自动解锁。counter = counter - 1;}
}int main()
{std::thread t1(add);std::thread t2(sub);t1.join();t2.join();std::cout << "counter:\t" << counter << std::endl;
}
来源:http://www.xieyincai.com/20190401835.html
C++多线程中互斥量std::mutex与模板类std::lock_guard相关推荐
- Linux多线程——使用互斥量同步线程
前文再续,书接上一回,在上一篇文章:Linux多线程--使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个 ...
- 线程同步 互斥量(mutex) Linux函数
线程同步: 线程的同步需要用到互斥量(mutex)用pthread_mutex_t类型表示. 互斥量(mutex)是一种简单的加锁的方法来控制对关心资源的访问.在同一时间只有一个线程掌握某个互斥上的锁 ...
- mysql 互斥_MySql中互斥量mutex的实现
数据库中的Mutex量指的是一种用于保护一些临界资源的使用的信号量.当有线程需要使用这些临界资源时,会请求获得mutex量,请求成功的线程进入临界区,而请求失败的线程只能等待它释放这个mutex.互斥 ...
- 互斥量(mutex)
Linux中提供一把互斥锁mutex(也称之为互斥量).每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁.资源还是共享的,线程间也还是竞争的,但通过"锁"就将资源 ...
- linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量
//包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...
- C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类
文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...
- C++11中模板类std::enable_shared_from_this的使用
C++11中的模板类template <class T> class enable_shared_from_this功能:允许从std::enable_shared_from_this派生 ...
- 08自定义异常类的两个例子(例子2为异常在继承中的应用,且包含模板类的应用)
08自定义异常类的两个例子 前提: 自定义异常两步曲: 1)提供一个接收char*的构造函数. 2)重写异常基类exception的两个虚函数-what()和析构(返回值类型忘记可以查看基类) 注意: ...
- std::atomic和std::mutex区别
std::atomic介绍 模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.在多线程调用下,利用std::atomic可实现数 ...
最新文章
- dataloader 源码_带你从零掌握迭代器及构建最简DataLoader
- fetch ajax cros,由 Fetch 跨域 看 CORS
- Java 8 新特性 Stream类的collect方法
- 百度地图3.2教程(2)公交查询
- Eclipse 4.7(Oxygen)安装Tomcat Plugin 后没有小猫图标解决方法
- Php 类似coffeescript,十个CoffeeScript一行程序——震惊你的小伙伴
- 灵派编码器HTTP API接口说明
- FFmpeg常用命令
- 个人php源码,php个人发卡平台源码 v1.4 免费版
- [Vue] Vue后台模板汇总
- springboot GeoLite2-City.mmdb实现通过IP地址获取经纬度以及该IP的所属地区
- JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
- Bable的简单使用
- benchmark TPC-H postgreSQL
- 图片镜像翻转 Java
- 招商银行信用卡中心信息技术部实习总结
- 基于VB图书管理系统的设计与实现
- 如何做一个python小程序?
- JS变量的定义和数据类型
- 广东技术师范大学计算机考研资料汇总