C++ 11多线程编程--std::lock_guard类
来源:互联网 发布:跟兄弟连学php 当当网 编辑:程序博客网 时间:2024/06/06 17:51
std::lock_guard类是一个包装类,通过锁类可以更好的获得和释放一个互斥体上的锁;锁类的析构函数会自动释放关联的互斥体。
标准定义的两种类型的锁
- std::lock_guard
- std::unique_guard
<1> std::lock_guard
lock_guard 对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard 对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard 的
生命 周期结束之后,
它所管理的锁对象会被解锁(注:类似 shared_ptr 等智能指针管理动态分配的内 存资源 )。
lock_guard 对象并不负责管理 Mutex 对象的生命周期,lock_guard 对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard 对象声明周期内,它所管理的锁对
象会一直保持上锁状态;
而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。
在学习std::lock_guard之前,先来看下与std::lock_guard和std::unique_guard相关的lock_tag(在<mutex>中定义)
- std::def_lock
- std::try_to_lock
- std::adopt_lock
std::def_lock, std::try_to_lock, std::adopt_lock 分别是空的struct标记类型defer_lock_t, try_to_lock_t, 和adopt_lock_t的实例 。定义如下:
- struct defer_lock_t {};
- struct try_to_lock_t {};
- struct adopt_lock_t {};
它们被用来为std::lock_guard和 std::unique_guard指定locking策略。
- defer_lock_t 不获取mutex的所有权(适用于std::unique_guard)
- try_to_lock_t 试图获取mutex的所有权,但不会阻塞(译注:一旦失败就返回,若成功,则会获得mutex所有权)(适用于std::unique_guard)
- adopt_lock_t 假设线程已经获得mutex的所有权(适用std::lock_guard和 std::unique_guard)
如果构造std::lock_guard之前 mutex已经获得锁 则需要在std::lock_guard 中指定std::adopt_lock,如果不指定std::adopt_lock,std::lock_guard还是会尝试获得锁导致线 塞。
// lock_guard类.cpp : 定义控制台应用程序的入口点。// constructing lock_guard with adopt_lock#include "stdafx.h"#include <iostream> // std::cout#include <thread> // std::thread#include <mutex> // std::mutex, std::lock_guard, std::adopt_lockstd::mutex mtx; // mutex for critical sectionvoid print_thread_id(int id){ mtx.lock(); std::lock_guard<std::mutex> lck(mtx, std::adopt_lock); std::cout << "thread #" << id << '\n';}int main(){ std::thread threads[10]; // spawn 10 threads: for (int i = 0; i<10; ++i) threads[i] = std::thread(print_thread_id, i + 1); for (auto& th : threads) th.join(); return 0;}/*输出结果*//****thread #1thread #2thread #3thread #4thread #5thread #6thread #7thread #8thread #9thread #10****/
0 0
- C++ 11多线程编程--std::lock_guard类
- C++11多线程之std::lock_guard
- C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
- std::mutex 、std::lock_guard
- C++11中std::lock_guard的使用
- 并发编程 C++11 lock_guard
- std::lock_guard and std::unique_lock
- std::lock_guard std::unique_lock 区别
- std::lock_guard 引起的思考
- C++多线程笔记:使用std::lock_guard实现对共享数据的保护
- std::mutex 和 std::lock_guard 小例子
- std::mutex 和 std::lock_guard 小例子
- std::lock_guard 和 std::unique_lock的区别
- C++——多线程编程(一)std::thread
- std::mutex std::unique_lock std::lock_guard std::recursive_mutex的理解
- c++11多线程编程(八):std::future , std::promise和线程的返回值
- C++——多线程编程(二)std::mutex 线程同步、解决资源竞争问题
- c++ 11 lock_guard/unique_lock详解
- case when用法
- CSS3的REM设置字体大小
- 教你如何关掉NEXUS5手机OTA升级提醒
- 嵌入式 - 虚拟机、开发板与主机Ping不通问题解决方法
- RabbitMQ概念及环境搭建 -- RabbitMQ cluster
- C++ 11多线程编程--std::lock_guard类
- NS3系列—5———NS3的两个例子
- 杭电1434 优先队列
- zxing
- 我的VB软件作品
- echarts地图上实现柱状图
- 抛弃默认签名,使用自己的签名*
- Centos7安装nginx教程!超简单
- [React Native]访问操作系统剪贴板 Clipboard