一、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需要付出更多的时间、性能成本。
二、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 timegettimeofday(&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 timegettimeofday(&tv,NULL);us_end = tv.tv_sec*1000000 + tv.tv_usec; //usprintf("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++之lock_guard和unique_lock自动加解锁区别相关推荐

  1. 【AI外呼+RPA自动加微】,解锁企微新能力

    促销季临近,各类线上促销活动又拉开帷幕,多数商家意识到,在铺广告.做推广获客的同时,还可以利用好现有的用户数据,与客户建立更紧密的联系.激活客户进行二次转化. 为了更加便于激活.运营客户,我们可以将客 ...

  2. lock_guard和unique_lock理解

    lock_guard和unique_lock都是RAII机制下的锁,即依靠对象的创建和销毁也就是其生命周期来自动实现一些逻辑,而这两个对象就是在创建时自动加锁,在销毁时自动解锁.所以如果仅仅是依靠对象 ...

  3. c++11中的lock_guard和unique_lock使用浅析

    锁 锁用来在多线程访问同一个资源时防止数据竞险,保证数据的一致性访问. 多线程本来就是为了提高效率和响应速度,但锁的使用又限制了多线程的并行执行,这会降低效率,但为了保证数据正确,不得不使用锁,它们就 ...

  4. lock_guard和unique_lock

    锁 锁用来在多线程访问同一个资源时防止数据竞险,保证数据的一致性访问.多线程本来就是为了提高效率和响应速度,但锁的使用又限制了多线程的并行执行,这会降低效率,但为了保证数据正确,不得不使用锁,它们就是 ...

  5. thinkphp 框架自动加载原理_ThinkPHP5分析Part 1 基本框架流程

    ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,是为了敏捷WEB应用开发和简化企业应用开发而诞生的.ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能 ...

  6. html分页自动加载,AutoPagerize插件,网页自动翻页插件,自动加载分页网站

    AutoPagerize,是一款可以实现网页自动翻页的浏览器插件,该插件会自动缓存下一页网页,将翻页式的内容变为瀑布流的形式,无需手动点击翻页,即可自动链接到下一页. 用于自动加载分页网页的浏览器扩展 ...

  7. PHP自动加载类—__autoload()和spl_autoload_register()

    test.php <?php function __autoload($class_name) { require_once $class_name . '.php'; } $obj = new ...

  8. PHP PSR-4 Autoloader 自动加载(中文版)

    引用:https://segmentfault.com/a/1190000002521658 Autoloader 关键词 "必须"("MUST")." ...

  9. jquery仿邮箱文本输入框自动加载邮箱后缀

    jquery仿邮箱文本输入框自动加载邮箱后缀 在像百度这样的网站注册时,你会看到输入邮箱会出现自动给用户输入补全主流邮箱.这种对于增加用户体验的小例子已司空见惯.正好看到人家写的这种js功能.还挺不错 ...

最新文章

  1. Extjs遇到的一些问题
  2. 在Docker启动Cloudera并开始体验
  3. Sudo 授权需谨慎,否则脸上泪两行
  4. 数据科学家数据分析师_使您的分析师和数据科学家在数据处理方面保持一致
  5. 每天进步一点点《ML - KNN》
  6. 中秋节,给大家送点货真价实的礼物
  7. vc 2010 下打包dll 的问题
  8. Run Book Automation - RBA开发系列一
  9. sphinx mysql实时搜素_【原创】sphinx实时索引的配置及实际应用、实例
  10. 解决递归求快速排序时间复杂度计算
  11. matlab 频率分辨率,功率谱、频率分辨率、频谱泄漏与窗函数
  12. php网站系统说明,国外CMS系统介绍(总结)
  13. Postgresql12 安装及设置远程访问
  14. 爆笑区块链段子送给你~
  15. 病历管理系统代码android,医院病例管理系统下载
  16. oracle elsif和else if,ORACLE ELSIF 与 ELSE IF
  17. lougu T7983 大芳的逆行板载
  18. 高项_第八章项目质量管理
  19. 全栈工程师开发实战之从入门到技术实战之02--vue指令
  20. 2.1 法学的历史(一):西方法学的历史

热门文章

  1. SpringBoot中如何优雅的使用拦截器
  2. Java反射及 IoC原理、内省机制
  3. 树形控件显示数据库数据项
  4. 保存命令行输出信息到log的方法(ubunut下和arm-linux下有效)
  5. 数据库连接池和线程池比较
  6. Sublime Text 插件-全栈开发收集
  7. 华丽的 Metro 风格小图标
  8. sqlite3:not found 解决方法
  9. linux svn官网,linux svn
  10. Leecode 入门--单链表-- 递归操作