多线程中有时需要锁住一个公共资源,使得多线程处理的同一块代码区时按照顺序执行,这时需要使用加锁,加锁的方法:mute方、lock_guard、unique_lock、contionditon_varibale,每个方法使用的场景不同。

1、C++11中提供了std::mutex互斥量,共包含四种类型:
std::mutex:最基本的mutex类。
std::recursive_mutex:递归mutex类,能多次锁定而不死锁。
std::time_mutex:定时mutex类,可以锁定一定的时间。
std::recursive_timed_mutex:定时递归mutex类。

mutex var1
var1.lock();//上锁
//function()加锁后操作
var1.unlock();//解锁

mute在多线程中的使用可以参考C++:mutex库_aixintianshideshouhu的博客-CSDN博客_mutex

上述的代码中的function若出现异常,则会出现死锁;若使用lock_guard就不会存在死锁问题。

2、std::lock_guard是锁管理器,它将尝试获取提供给它的互斥锁的所有权。当控制流离开lock_guard对象的作用域时,lock_guard析构并释放互斥量。

{mutex var1
std::lock_guard<std::mutex>lockVar(var1);
//function()加锁后操作
}

上述代码中,加锁后,就算执行function出现异常,当程序执行完{}内容后,lockVar生存周期结束,就不会出现死锁问题。

3、std::unique_lock是另一种锁管理器,它拥有lock_guard的功能,但比其功能更强大。

lock_guard和unique_lock的在多线程中的使用可以参考c++11中的lock_guard和unique_lock使用浅析_guotianqing的博客-CSDN博客

4、std::condition_variable 是条件变量,常用的函数有wait。wait作用是用std::unique_lock锁住当前线程,当前线程会一直被阻塞,直到另外一个线程在相同的 std::condition_variable 对象上调用了 notification 函数来唤醒当前线程。

(1)wait(unique_lock <mutex>&lck)

当前线程的执行会被阻塞,直到收到 notify 为止。

(2)wait(unique_lock <mutex>&lck,Predicate pred)

当前线程仅在pred=false时阻塞;如果pred=true时,不阻塞。

wait()可依次拆分为三个操作:释放互斥锁、等待在条件变量上、再次获取互斥锁。

std::condition_variable在多线程的使用可参考C++11 并发指南五(std::condition_variable 详解) - Haippy - 博客园 (cnblogs.com)

多线程mute/lock_guard/unique_lock/condition_variable访问同一公共资源相关推荐

  1. Oracle字符串转BooIean,利用Java的多线程技术实现数据库的访问.pdf

    利用Java的多线程技术实现数据库的访问.pdf 第 卷第 期 计算机应用 22 12 Voi .22 , No . 12 年 月 2002 12 Computer Appiications Dec ...

  2. 多线程中数据的并发访问与保护

    在多线程编程中,不可避免地要对一些共享的数据进行访问.由于线程之间对共享数据的访问是独立的,任何一个线程都可对共享数据进行访问和修改,且它们之间是异步并发进行的,特别是当需要对共享数据进行修改时,就会 ...

  3. 多线程对共享资源的访问

    一.什么是多线程? 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 所有的线程虽然在微观上是串行执行的,但是在宏观上你完全可以认为它们在并行执行 二.那什 ...

  4. C#多线程窗体控件安全访问实现方法

    C# 2.0 为了线程安全,不充许子线程直接访问窗体中的控件 如果在子线程中直接访问说窗体控件,编译器会提示,控件不是 由该线程创建的. 那么在子线程中如何访问窗体中的控件呢? 在窗体的构造函数中加入 ...

  5. C++多线程详细讲解

    本文是纯转载,觉得大佬写的非常好!如有侵权可以删除 链接: link. C++多线程基础教程 目录 1 什么是C++多线程? 2 C++多线程基础知识 2.1 创建线程 2.2 互斥量使用 lock( ...

  6. C++多线程同步的几种方式

    文章目录 Overview mutex lock_guard unique_lock condition_variable future promise packaged_task async Ref ...

  7. unique_lock与lock_guard区别

    使用方式 lock_guard: 没有提供加锁和解锁的接口. 通过构造函数和析构函数控制锁的作用范围,创造对象的时候加锁,离开作用域的时候解锁: unique_lock: 提供了lock()和unlo ...

  8. 两个线程同时访问一个变量_百战程序员:Java多线程对象及变量的并发访问

    在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...

  9. 多线程访问共同的代码或者对象:lock避免出错

    现在写程序多线程是不可避免的,而且经常会出现多线程访问共同资源的情况.多线程对共同资源的访问,往往会造成数据的混乱和不可预料的结果,因此一般需要加锁访问进行互斥访问.加锁就需要用到lock关键字.所谓 ...

  10. 基于C API的MySQL数据库多线程访问方法

    说明:如何生成线程式客户端 客户端库总是线程安全的.最大的问题在于从套接字读取的net.c中的子程序并不是中断安全的.或许你可能希望用自己的告警中断对服务器的长时间读取,以此来解决问题.如果为SIGP ...

最新文章

  1. Sharding Sphere 读写分离的配置
  2. 【顶】Asp无组件生成缩略图(1)
  3. grep 显示包含两个关键字_linux三剑客之-grep
  4. centos下redis安全相关
  5. 【开发】 eclipse汉化包
  6. linux 远程连接工具
  7. C# 中文乱码,转成中文
  8. chrome下载文件竟然都有缓存!
  9. 计算机键盘怎么输入平方,word里平方2怎么打_在word里输入㎡符号的方法
  10. AR涂涂乐项目之识别图制作制作地球仪剪影二
  11. 华为中标肯尼亚蒙内铁路项目 提供面向未来的运营通信网络
  12. 相机ISO是什么 ISO是什么意思?
  13. 一年中最后一个月的最后一天说说_2020只剩最后一个月的励志说说致自己
  14. 酷派android最新版本,酷云手机版下载
  15. libuv 的Processes
  16. GitHub如何从远程库克隆
  17. 「滴滴-橙心优选」秋招面试复盘总结
  18. 安装CDH5.15.0过程详细记录¥坑与解决办法(20180724)
  19. 安装hadoop集群模拟大数据集群踩到的坑(一)
  20. 【机器学习中的矩阵分解】LU分解、QR分解、SVD分解

热门文章

  1. 前端项目架构模板-(三)交互式打包及自动化部署前端项目
  2. better-scroll使用的坑与心得
  3. 黑马vue实战项目-(三)权限管理功能开发
  4. java opencv gamma_OpenCV函数cvAddWeighted调整alpha和gamma值 | 学步园
  5. linux重定向文件容加时间,linux – Shell重定向和文件I / O持续时间
  6. cookie的相关概念及原理
  7. shell 封装方法_反弹shell逃逸基于execve的命令监控(上)
  8. 取消input聚焦时的边框,去除ios点击时,自动添加的底色效果
  9. 七牛云存储,资源云存储平台
  10. Java线程经典面试题