锁,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
在代码中,m 是一个全局变量,由各线程共享。m 是一把锁,上锁和解锁之间的代码
是临界区。锁保证了如果一个线程正在执行临界区的代码,其它线程就必须等待。
atomic
C++中的 std::atomic 对 int, char, bool 等数据结构进行原子性封装,在多线程环境中, 对std::atomic对象的访问不会造成竞争-冒险。利用std::atomic可实现数据结构的无锁设计
lock_guard
- mutex类的lock和unlock方法成对使用,保证了lock和unlock之间的代码是临界区。但是,
若在临界区出现异常,会导致线程阻塞,没有释放锁,导致其他线程也进不了临界区。
- lock_guard用来管理锁。某个 lock_guard 对象的声明周期内,它所管理的锁对象会 一直保持上锁状态;而 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 生存期内解锁。