多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁)。

(1).直接操作 mutex,即直接调用 mutex 的 lock / unlock 函数。此例顺带使用了 boost::thread_group 来创建一组线程。

[cpp] view plain copy
#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

boost::mutex mutex;
int count = 0;

void Counter() {
mutex.lock();

int i = ++count;
std::cout << "count == " www.furggw.com/<< i << std::endl;

// 前面代码如有异常,unlock 就调不到了。
mutex.unlock();
}

int main() {
// 创建一组线程。
boost::thread_group threads;
for (int i = 0; i www.mcyulegw.com< 4; ++i) {
threads.create_thread(&Counter);
}

// 等待所有线程结束。
threads.join_all();
return 0;
}
(2).使用 lock_guard 自动加锁、解锁。原理是 RAII,和智能指针类似

[cpp] view plain copy
#include <iostream>
#include <boost/thread/lock_guard.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

boost::mutex mutex;
int count = 0;

void Counter() {
// lock_guard 在构造函数里加锁,在析构函数里解锁。
boost::lock_guard<boost::mutex> lock(mutex);

int i = ++count;
std::cout << "count == " << i << std::endl;
}

int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}

threads.join_all();
return 0;
}
(3).使用 unique_lock 自动加锁、解锁。
unique_lock 与 lock_guard 原理相同,但是提供了更多功能(比如可以结合条件变量使用)。注意:mutex::scoped_lock 其实就是 unique_lock<mutex> 的 typedef。

[cpp] view plain copy
#include <iostream>
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>

boost::mutex mutex;
int count = 0;

void Counter() {
boost::unique_lock<boost::mutex> lock(mutex);

int i = ++count;
std::cout << "count == " << i << std::endl;
}

int main() {
boost::thread_group threads;
for (int i = 0; i < 4; ++i) {
threads.create_thread(&Counter);
}

threads.join_all();
return 0;

转载于:https://www.cnblogs.com/qwangxiao/p/8656295.html

C++11Mutex(互斥锁)详解相关推荐

  1. python3 一 线程与互斥锁详解

    什么是线程? 可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等,线程是操作系统调度执行的最小单位. 线程的创建步骤 Import threading # 导入模块 ...

  2. 多线程(二)互斥锁详解

    目录 一.什么是互斥锁 二.为什么需要互斥锁 三.互斥锁的原理 四.互斥锁的相关接口 五.互斥锁的使用举例 一.什么是互斥锁 保证线程安全的一种锁机制,在同一时刻,只允许一个执行流去访问临界资源. 二 ...

  3. 多线程锁详解之【临界区】

    更多的锁介绍可以先看看这篇文章:多线程锁详解之[序章] 正文: 一般锁的类型可分为两种:用户态锁和内核态锁.用户态锁是指这个锁的不能够跨进程使用.而内核态锁就是指能够跨进程使用的锁.一般书中会说,wi ...

  4. Redis分布式锁详解

    Redis分布式锁详解 1. 分布式所概述 1.1 分布式锁 2. 缓存数据库Redis 2.1 redis简介 2.2 Springboot整合Redis两种方式 3. 实现验证 3.1 环境准备 ...

  5. Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解

    缓存雪崩 在某一个时间存在大量的缓存key失效 解决办法 1.有效期一直---->给每一个数据加上水机有效期 2.redis挂掉了----->使用redis集群,分摊key的存储 引出re ...

  6. mysql默认使用悲观锁_mysql乐观锁和悲观锁详解

    mysql乐观锁和悲观锁详解 相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了. 那么乐观锁和悲观锁到 ...

  7. 可重入锁详解(什么是可重入)

    可重入锁详解 概述 什么是 "可重入",可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁.例如 package com.test.reen;// 演示可重入锁是什么 ...

  8. 公平锁非公平锁的实际使用_java 线程公平锁与非公平锁详解及实例代码

    java 线程公平锁与非公平锁详解 在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync.公平锁的作用就是严格按照线程启动的顺序来 ...

  9. python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案

    先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...

  10. 旋转矩阵、欧拉角、万向锁详解

    旋转矩阵.欧拉角.万向锁详解 一:物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Z ...

最新文章

  1. Sqlite 错误码
  2. python鼠标碰撞_获取鼠标指针测试item之间的碰撞
  3. 如果再这么玩下去,中国的科研就没戏了
  4. Python CGI 编程 | 类FieldStorage的使用
  5. 关于Cocos2d-x中GameController的定义
  6. 如何看Spring源码
  7. actionSupport类
  8. 华为手机android怎么解锁,怎么查看华为手机解锁
  9. 【视频目标检测】|Towards High Performance Video Object Detection
  10. 智能型电话远程遥控器
  11. ctf镜子里面的世界_一个小编姐姐的CTF入坑之旅
  12. ESXI VM快照删除卡在99%
  13. 【谷粒学院项目开发44】课程大纲——小节的添删
  14. 韩国的开发者开源项目 paper with code论文自动下载
  15. npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! wlwl-dsfvue@1.0.0 dev: `node build/dev-server.js`报错
  16. CNN经典分类网络发展历程GoogLeNet、SqueezeNet、ResNet、ResNeXt、DenseNet
  17. 转录组表达量计RPKM、FPKM、TPM说明
  18. XSLT-FO基础知识
  19. 前端Vue压缩图片视频ZIP
  20. 【课程设计】通讯录管理系统(源码 + 详解)

热门文章

  1. SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())
  2. Windows平台下NS2网络仿真环境的搭建
  3. Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)
  4. HDFS基本命令及上传文件API
  5. 盈建科弹性板6计算_盈建科(300935):国内建筑结构设计软件行业的领先企业...
  6. java ajax文字搜素,JAVA-WEB AJAX 搜索条自动提示
  7. 计算机网络—信道划分与介质访问控制
  8. 2014蓝桥杯C++B:啤酒和饮料;切面条(思维分析)
  9. Photoshop1:入门实用技巧
  10. OpenGL基础25:多光源(附简单GLSL配置)