(一)unique_lock
std::unique_lock为锁管理模板类,是对通用mutex的封装。std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即在unique_lock对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而unique_lock的生命周期结束之后,它所管理的锁对象会被解锁。unique_lock具有lock_guard的所有功能,而且更为灵活。虽然二者的对象都不能复制,但是unique_lock可以移动(movable),因此用unique_lock管理互斥对象,可以作为函数的返回值,也可以放到STL的容器中。
(二)
std::unique_lock比std::lock_guard更灵活,这种灵活性主要体现在以下几点:
lock_guard在构造时或者构造前(std::adopt_lock)就已经获取互斥锁,并且在作用域内保持获取锁的状态,直到作用域结束;而unique_lock在构造时或者构造后(std::defer_lock)获取锁,在作用域范围内可以手动获取锁和释放锁,作用域结束时如果已经获取锁则自动释放锁。
lock_guard锁的持有只能在lock_guard对象的作用域范围内,作用域范围之外锁被释放,而unique_lock对象支持移动操作,可以将unique_lock对象通过函数返回值返回,这样锁就转移到外部unique_lock对象中,延长锁的持有时间。
int n;
std::mutex some_mutex;
void prepare_data()
{
cout << n++ << endl;
}
void do_something()
{
cout << n++ << endl;
}
std::unique_lock<std::mutex> get_lock()
{
std::unique_lock<std::mutex> lk(some_mutex);//与lock_guard相同,构造时获取锁
cout << "owns_lock? " << lk.owns_lock() << endl;//1
prepare_data();
return lk;
}
int main()
{
//unique_lock基本使用
std::mutex mutex2;
std::unique_lock<std::mutex> lock2(mutex2, std::defer_lock);//告诉构造函数暂不获取锁
cout << "owns_lock? " << lock2.owns_lock() << endl;//0
lock2.lock();//手动获取锁
std::cout << "owns_lock? " << lock2.owns_lock() << endl;//1
lock2.unlock();//手动解锁
cout << "owns_lock? " << lock2.owns_lock() << endl;//0
//锁所有权转移到函数外部
std::unique_lock<std::mutex> lk(get_lock());//
do_something();
}
//析构
//lock2未获取锁mutex2,因此不会调用unlock
//lk对象持有锁some_mutex,调用unlock
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!