一、 互斥量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相关推荐

  1. Linux多线程——使用互斥量同步线程

    前文再续,书接上一回,在上一篇文章:Linux多线程--使用信号量同步线程中,我们留下了一个如何使用互斥量来进行线程同步的问题,本文将会给出互斥量的详细解说,并用一个互斥量解决上一篇文章中,要使用两个 ...

  2. 线程同步 互斥量(mutex) Linux函数

    线程同步: 线程的同步需要用到互斥量(mutex)用pthread_mutex_t类型表示. 互斥量(mutex)是一种简单的加锁的方法来控制对关心资源的访问.在同一时间只有一个线程掌握某个互斥上的锁 ...

  3. mysql 互斥_MySql中互斥量mutex的实现

    数据库中的Mutex量指的是一种用于保护一些临界资源的使用的信号量.当有线程需要使用这些临界资源时,会请求获得mutex量,请求成功的线程进入临界区,而请求失败的线程只能等待它释放这个mutex.互斥 ...

  4. 互斥量(mutex)

    Linux中提供一把互斥锁mutex(也称之为互斥量).每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束解锁.资源还是共享的,线程间也还是竞争的,但通过"锁"就将资源 ...

  5. linux 只运行一个实例 互斥锁,Linux多线程4-1_互斥量

    //包含头文件 int pthread_mutex_destroy(pthread_mutex_t *mutex); int pthread_mutex_init(pthread_mutex_t *r ...

  6. C++11多线程,thread库; mutex类,成员函数lock(), unlock();unique_lock<mutex>模板类

    文章目录 进程和线程 1. 进程 2. 线程 C++11多线程编程 1. C++11新标准 2. 创建线程 1. 普通函数 2. 仿函数 3. 成员函数 4. 多线程数据保护(数据一致性) 进程和线程 ...

  7. C++11中模板类std::enable_shared_from_this的使用

    C++11中的模板类template <class T> class enable_shared_from_this功能:允许从std::enable_shared_from_this派生 ...

  8. 08自定义异常类的两个例子(例子2为异常在继承中的应用,且包含模板类的应用)

    08自定义异常类的两个例子 前提: 自定义异常两步曲: 1)提供一个接收char*的构造函数. 2)重写异常基类exception的两个虚函数-what()和析构(返回值类型忘记可以查看基类) 注意: ...

  9. std::atomic和std::mutex区别

    ​std::atomic介绍​ ​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.​在多线程调用下,利用std::atomic可实现数 ...

最新文章

  1. dataloader 源码_带你从零掌握迭代器及构建最简DataLoader
  2. fetch ajax cros,由 Fetch 跨域 看 CORS
  3. Java 8 新特性 Stream类的collect方法
  4. 百度地图3.2教程(2)公交查询
  5. Eclipse 4.7(Oxygen)安装Tomcat Plugin 后没有小猫图标解决方法
  6. Php 类似coffeescript,十个CoffeeScript一行程序——震惊你的小伙伴
  7. 灵派编码器HTTP API接口说明
  8. FFmpeg常用命令
  9. 个人php源码,php个人发卡平台源码 v1.4 免费版
  10. [Vue] Vue后台模板汇总
  11. springboot GeoLite2-City.mmdb实现通过IP地址获取经纬度以及该IP的所属地区
  12. JAVA_判断日期是否为工作日(排除节假日和调整周末上班)
  13. Bable的简单使用
  14. benchmark TPC-H postgreSQL
  15. 图片镜像翻转 Java
  16. 招商银行信用卡中心信息技术部实习总结
  17. 基于VB图书管理系统的设计与实现
  18. 如何做一个python小程序?
  19. JS变量的定义和数据类型
  20. 广东技术师范大学计算机考研资料汇总

热门文章

  1. DiscuzX2.5视频教程
  2. TWaver版3D化学元素周期表
  3. 华为2011上机笔试题2+参考程序
  4. 雷观(八):等我有钱了再付费,是一种很扯淡很没有远见的想法
  5. centos 防火墙位置
  6. Oracle osw监控工具的使用示例
  7. 关于虚拟机vmware共享虚拟网卡上网
  8. 程序出错后,程序员给测试人员的20条高频回复
  9. 如何保护企业网络免受勒索软件攻击 Vecloud微云
  10. Vue前端-Flask后台跨域访问问题的处理