C++之lock_guard和unique_lock自动加解锁区别(九十三)
2023-09-14 09:09:57 时间
1.如何使用
一、std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。
1.std::lock_guard
std::lock_guard是RAII模板类的简单实现,功能简单。
1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。
2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;在实际编程中,我们也可以根据自己的场景编写resource_guard RAII类,避免忘掉释放资源。
2.std::unique_lock
类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。
unique_lock比lock_guard使用更加灵活,功能更加强大。
使用unique_lock需要付出更多的时间、性能成本。
2.代码示例
二、demo
# emacs test.cpp
// unique_lock example
#include <iostream>
#include <thread>
#include <mutex>
#include <sys/time.h>
std::mutex mtx;
struct timeval tv;
unsigned long us_start,us_end;
void print_block (int n, char c) {
//start time
gettimeofday(&tv,NULL);
us_start = tv.tv_sec*1000000 + tv.tv_usec; //us
//1.unique_lock加锁,没有mutex所有的权限,(根据mutex的属性来判断是否能够加锁, 自动加锁自动解锁), 时间上比lock_guard慢
std::unique_lock<std::mutex> lck (mtx);//如果不加锁,线程打印为乱序.
//lck.unlock();//不用调用,自动加锁自动解锁.
//2.锁定的向导拥有mutex所有的权限,自动加锁自动解锁(浪费时间) 一旦读取失败,就一直等待
//std::lock_guard<std::mutex>lck (mtx);
for (int i=0; i<n; ++i) { std::cout << c; }
std::cout << '\n';
//end time
gettimeofday(&tv,NULL);
us_end = tv.tv_sec*1000000 + tv.tv_usec; //us
printf("us_delta = %ld us\n",us_end - us_start);
}
int main (){
std::thread th1 (print_block,100,'*');
std::thread th2 (print_block,100,'$');
th1.join();
th2.join();
//std::cin.get();
return 0;
}
相关文章
- 【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline
- C++和C中的函数如何相互调用
- Win10系列:VC++绘制几何图形4
- C/C++基础讲解(三十四)之数值计算与趣味数学篇(扑克牌自动发牌与常胜将军)
- paip.提升用户体验=----c++ qt 字体切换功能缺少的总结..
- C++:C++编程语言学习之数学运算&运算符及其优先级的简介、案例应用之详细攻略
- MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
- 【C++】使用局部变量赋值而非引用,导致内存多次释放的野指针问题
- C++ 二分查找小练
- C++11 noexcept修饰符与noexcept操作符
- C++_COM 入门
- 【C++ 科学计算】矩阵元素绝对值小于设定值时,元素值变为零