三、mutex
1、基本mutex
定义在头文件mutex中,std命名空间。
#include <mutex>
基本mutex的用法非常普通,和pthread中无异,在c语言的编程中,对于mutex的lock和unlock是较为麻烦的,因为要关注正常退出和异常退出时,锁的释放,否则将容易造成死锁,还有线程被cancel时候锁的释放。
在c++中聪明的利用了对象销毁时自动析构的机制,采用了RAII思想,对锁进行了封装管理,所以一般在使用c++的锁时,应该是不建议直接对mutex对象进行操作的,而应该借助这些管理类型来操作。
2.基本的两个锁管理类:lock_guard, scoped_lock
- lock_guard
lockguard类型只有构造函数和析构函数,只提供最简单的RAII机制,既初始化时获取mutex并锁定,出定义域时析构函数里自动释放锁,这就解决了之前提出的那些麻烦的场景问题,因为不管时cancel了线程还是出现异常退出了线程,变量都将退出定义域,析构函数都将自动调用,锁都会释放。
该类型只能用于锁定一个锁,一般用于某个函数只对一个mutex管理下的数据进行修改访问时使用:
//省略各种头文件
std::mutex one_mutex;
int data=0;
void modify_shared_data(){
std::lock_guard<std::mutex> guard(one_mutex);
data++;
std::cout<<"Now, data is: "<<data<<std::endl;
} //guard的析构函数自动释放锁</