C++中的std::lock_guard和std::unique_lock
std::lock_guard
这是最简单的一个管理锁的对象。只有构造和析构函数,在构造的时候加锁,析构的时候解锁,解锁后就不能使用该对象再加锁了。可以避免使用std::mutex
时忘记解锁的情况,同时可以方便处理异常。
简单的实例:
#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <stdexcept>std::mutex mtx;void print_even(int n) {if(n % 2 == 0) {std::cout << n << " is even\n";} else {throw std::logic_error("not even\n");}
}void print_thread_id(int id) {try {// 在这里,try块是单独一个部分,离开块之后,锁就自动析构了std::lock_guard<std::mutex>lck(mtx);print_even(id);} catch(std::logic_error&) {std::cout << "[exception caught]\n";}
}int main() {// 创建线程组std::vector<std::thread>threads;for(int i = 0; i < 10; ++i) {threads.emplace_back(std::thread(print_thread_id, i + 1));}// 所有线程等待归并for(auto& th : threads) {th.join();}return 0;
}
/*
输出结果:
[exception caught]
2 is even
[exception caught]
4 is even
[exception caught]
6 is even
[exception caught]
8 is even
[exception caught]
10 is even
*/
std::unique_lock
拥有std::lock_guard
所有的功能,但是更加灵活,也有更多的接口;时间和空间要求也更高了。
给出常用的5个构造函数:
unique_lock() noexcept; // (1)
explicit unique_lock (mutex_type& m); // (2)
unique_lock (mutex_type& m, try_to_lock_t tag); // (3)
unique_lock (mutex_type& m, defer_lock_t tag) noexcept; // (4)
unique_lock (mutex_type& m, adopt_lock_t tag); // (5)
- 仅仅定义一个对象,不管理任何锁对象
- 管理锁对象
m
,同时尝试调用m.lock()
进行加锁,如果别的unique_lock
已经管理了当前锁m
,那么当前线程阻塞。 - 管理锁对象
m
,如果上锁失败,线程不会阻塞 - 管理锁对象
m
,初始化的时候不会锁住m
- 管理锁对象
m
,而且m
应当是一个已经被当前线程锁住的Mutex对象
常用的成员函数:
try_lock
上锁成功返回true
,否则返回false
try_lock_for
,调用管理对象的try_lock_for
函数,成功返回true
,失败返回false
try_lock_until
,同try_lock_for
unlock
,调用管理对象的unlock
函数release
,返回管理锁的指针,并释放管理权owns_lock
,判断是否拥有了锁。
C++中的std::lock_guard和std::unique_lock相关推荐
- 【多线程】多线程锁住的是什么、std::lock_guard<std::mutex> locker(mutex_)
通常不直接使用 mutex,lock_guard更加安全, 更加方便. lock_guard简化了 lock/unlock 的写法, lock_guard在构造时自动锁定互斥量, 而在退出作用域时会析 ...
- C++11中std::lock_guard的使用
互斥类的最重要成员函数是lock()和unlock().在进入临界区时,执行lock()加锁操作,如果这时已经被其它线程锁住,则当前线程在此排队等待.退出临界区时,执行unlock()解锁操作.更好的 ...
- Multi-thread--C++11中std::lock_guard的使用
互斥类的最重要成员函数是lock()和unlock().在进入临界区时,执行lock()加锁操作,如果这时已经被其它线程锁住,则当前线程在此排队等待.退出临界区时,执行unlock()解锁操作.更好的 ...
- std::unique_lock与std::lock_guard区别示例
std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活. std::lock_guard std::lock_guard是RAII模板类的简单实现,功能 ...
- C++多线程中互斥量std::mutex与模板类std::lock_guard
一. 互斥量std::mutex C++中通过实例化std::mutex创建互斥量实例,通过成员函数lock()对互斥量上锁,unlock()进行解锁.C++中与std::mutex相关的类(包括锁类 ...
- C++ folly库解读(三)Synchronized —— 比std::lock_guard/std::unique_lock更易用、功能更强大的同步机制
目录 返利 www.cpa5.cn 传统同步方案的缺点 folly/Synchronized.h 简单使用 Synchronized的模板参数 withLock()/withRLock()/withW ...
- C++11 std::mutex使用以及std::lock_guard自动解锁避免忘记解锁
文章目录 **std::mutex** std::mutex 的成员函数 示例 **std::lock_guard** std::mutex 头文件是<mutex>,mutex是用来保证线 ...
- std::lock_guard的原理和应用
std::lock_guard的原理和应用 一.lock_guard 二.使用示例 三.原理分析 四.总结 一.lock_guard lock_guard是一种在作用域内控制可锁对象所有权的类型. ( ...
- std::lock_guard使用案例及常用系统函数调用案例
1)lock_guard有两个构造函数,使用方法如下(注意:一定要声明一个局部的lock_guard对象): std::mutex mtx; (1)一个参数的使用方法:lock_guard lock( ...
最新文章
- 在UI设计中如何正确使用颜色
- 看看40万程序猿怎么评论:对于程序员英语真的重要吗?
- 更新linux内核版本,求问Linux最新内核版本以及发布日期。
- 网站集成PayPal如何设置
- 最简单的c#Remoting编程
- php每个月头一天与最后一天,PHP获取每月第一天与最后一天
- Sentinel(十八)之注解支持
- 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
- java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
- python求单链表的长度_709. 设计链表(Python)
- php player baidu,BaiduPlayer.php
- GitHub账户注册流程及常见问题解析
- 强网杯2019(高明的黑客强网先锋上单)
- 0基础学前端开发,CSS盒子模型居中方法
- 0基础小学生做的网站
- 拜师————python基础入门——守破离学习法,海龟绘图,画出奥运五环图,day3
- opencv中直方图均衡函数cv::equalizeHist()的使用!!严格用程序进行了验证!
- android动画特效
- 命运赋——原文与译文
- 手把手编译基于恩智浦MCAL的工程