C++11Mutex(互斥锁)详解
多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 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(互斥锁)详解相关推荐
- python3 一 线程与互斥锁详解
什么是线程? 可以简单理解为同一进程中有多个计数器,每个线程的执行时间不确定,而每个进程的时间片相等,线程是操作系统调度执行的最小单位. 线程的创建步骤 Import threading # 导入模块 ...
- 多线程(二)互斥锁详解
目录 一.什么是互斥锁 二.为什么需要互斥锁 三.互斥锁的原理 四.互斥锁的相关接口 五.互斥锁的使用举例 一.什么是互斥锁 保证线程安全的一种锁机制,在同一时刻,只允许一个执行流去访问临界资源. 二 ...
- 多线程锁详解之【临界区】
更多的锁介绍可以先看看这篇文章:多线程锁详解之[序章] 正文: 一般锁的类型可分为两种:用户态锁和内核态锁.用户态锁是指这个锁的不能够跨进程使用.而内核态锁就是指能够跨进程使用的锁.一般书中会说,wi ...
- Redis分布式锁详解
Redis分布式锁详解 1. 分布式所概述 1.1 分布式锁 2. 缓存数据库Redis 2.1 redis简介 2.2 Springboot整合Redis两种方式 3. 实现验证 3.1 环境准备 ...
- Redis缓存雪崩、穿透、击穿,布隆过滤器,分布式锁详解
缓存雪崩 在某一个时间存在大量的缓存key失效 解决办法 1.有效期一直---->给每一个数据加上水机有效期 2.redis挂掉了----->使用redis集群,分摊key的存储 引出re ...
- mysql默认使用悲观锁_mysql乐观锁和悲观锁详解
mysql乐观锁和悲观锁详解 相信很多朋友在面试的时候,都会被问到乐观锁和悲观锁的问题,如果不清楚其概念和用法的情况下,相信很多朋友都会感觉很懵逼,那么面试的结果也就不言而喻了. 那么乐观锁和悲观锁到 ...
- 可重入锁详解(什么是可重入)
可重入锁详解 概述 什么是 "可重入",可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁.例如 package com.test.reen;// 演示可重入锁是什么 ...
- 公平锁非公平锁的实际使用_java 线程公平锁与非公平锁详解及实例代码
java 线程公平锁与非公平锁详解 在ReentrantLock中很明显可以看到其中同步包括两种,分别是公平的FairSync和非公平的NonfairSync.公平锁的作用就是严格按照线程启动的顺序来 ...
- python gil 解除_详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
先看一道GIL面试题: 描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因. GIL:又叫全局解 ...
- 旋转矩阵、欧拉角、万向锁详解
旋转矩阵.欧拉角.万向锁详解 一:物体的姿态描述 物体的姿态可由固定于此物体的坐标系描述,为了规定空间某刚体B的姿态,设置一直角坐标系{B}与此刚体固接.用坐标系{B}的三个单位主矢量{Xb,Yb,Z ...
最新文章
- Sqlite 错误码
- python鼠标碰撞_获取鼠标指针测试item之间的碰撞
- 如果再这么玩下去,中国的科研就没戏了
- Python CGI 编程 | 类FieldStorage的使用
- 关于Cocos2d-x中GameController的定义
- 如何看Spring源码
- actionSupport类
- 华为手机android怎么解锁,怎么查看华为手机解锁
- 【视频目标检测】|Towards High Performance Video Object Detection
- 智能型电话远程遥控器
- ctf镜子里面的世界_一个小编姐姐的CTF入坑之旅
- ESXI VM快照删除卡在99%
- 【谷粒学院项目开发44】课程大纲——小节的添删
- 韩国的开发者开源项目 paper with code论文自动下载
- npm ERR! code ELIFECYCLEnpm ERR! errno 1npm ERR! wlwl-dsfvue@1.0.0 dev: `node build/dev-server.js`报错
- CNN经典分类网络发展历程GoogLeNet、SqueezeNet、ResNet、ResNeXt、DenseNet
- 转录组表达量计RPKM、FPKM、TPM说明
- XSLT-FO基础知识
- 前端Vue压缩图片视频ZIP
- 【课程设计】通讯录管理系统(源码 + 详解)
热门文章
- SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())
- Windows平台下NS2网络仿真环境的搭建
- Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)
- HDFS基本命令及上传文件API
- 盈建科弹性板6计算_盈建科(300935):国内建筑结构设计软件行业的领先企业...
- java ajax文字搜素,JAVA-WEB AJAX 搜索条自动提示
- 计算机网络—信道划分与介质访问控制
- 2014蓝桥杯C++B:啤酒和饮料;切面条(思维分析)
- Photoshop1:入门实用技巧
- OpenGL基础25:多光源(附简单GLSL配置)