锁,mutex互斥量,atomic原子操作,lock_guard

 Mutex 类

Mutex 是 C++11 中最基本的互斥量。Mutex 有两个常用的方法: 上锁操作 lock(),和解锁操作 unlock()。

文件 exp4_1.cc。 编译命令: g++ exp4_1.cc –o exp4_1–std=c++11 -lpthread   执行 ./exp4_1

锁,mutex互斥量,atomic原子操作,lock_guard

在代码中,m 是一个全局变量,由各线程共享。m 是一把锁,上锁和解锁之间的代码
是临界区。锁保证了如果一个线程正在执行临界区的代码,其它线程就必须等待。

atomic

C++中的 std::atomic 对 int, char, bool 等数据结构进行原子性封装,在多线程环境中, 对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计

锁,mutex互斥量,atomic原子操作,lock_guard

lock_guard

  • mutex类的lock和unlock方法成对使用,保证了lock和unlock之间的代码是临界区。但是,

           若在临界区出现异常,会导致线程阻塞,没有释放锁,导致其他线程也进不了临界区。

  • lock_guard用来管理锁。某个 lock_guard 对象的声明周期内,它所管理的锁对象会 一直保持上锁状态;而 lock_guard 的生命周期结束之后,它所管理的锁对象会被解锁。 这功能类似智能指针。请看例程

锁,mutex互斥量,atomic原子操作,lock_guard

 while 循环{}内定义了一个变量 guard,如蓝框所示。guard 是 std 标准库提 供的 lock_guard<mutex>模板类型。guard 用来管理锁 m, m 是全局变量,是各线程共享的锁。

  • 在 guard 创建时,自动执行了上锁操作,即 m.lock(); 
  • 在 guard 的生存期结束前,即 while 的}前,自动解锁,即 m.unlock(); 

C++11 还提供了一个托管锁的模板类型 unique_lock。与 lock_guard 相似,unique_lock 也用来管理锁。lock_guard 只有在生存期开始时上锁、生存期结束前解锁。unique_lock 提供 更灵活的上锁和解锁机制。unique_lock 有 unlock()方法,可以在 unique_lock 生存期内解锁。 

锁,mutex互斥量,atomic原子操作,lock_guard

原文链接: https://www.cnblogs.com/technicist/p/12728266.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    锁,mutex互斥量,atomic原子操作,lock_guard

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/342900

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午1:48
下一篇 2023年3月2日 上午1:48

相关推荐