C++ std::unique_lock,以及处理锁

实现std::lock_guard能干的活,std::unique_lock都能干,且std::unique_lock的灵活性是比std::lock_guard高的;

-:因为std::unique_lock重载了lock和unlock方法,它可以作为std::lock的参数;

-:std::unique_lock的实例不依赖于std::mutex等锁,所以在初始化的时候,他有空构造函数的,即我们可以不传锁进去,当然,这就导致了std::unique_lock的锁有两种状态,即内部有无锁,这个可以通过bool std::unique_lock.owns_lock()来检测;

-:std::unique_lock可以在运行时自主决策是否放弃锁的所有权,这个是通过

	_Mutex *release() noexcept
	{	// disconnect
		_Mutex *_Res = _Pmtx;
		_Pmtx = nullptr;
		_Owns = false;
		return (_Res);
	}

std::mutex* std::unique_lock.release()来实现的,他会自己破坏与锁的关系,且返回锁的指针[当实例不持有锁的时候,返回nullptr];

注意:release并没有给mutex解锁,以下不安全使用release函数会导致死锁;

#include<iostream>
#include<thread>
#include<mutex>
std::mutex mtx;
void fun1() {
	std::lock_guard<std::mutex> lock_g(mtx);
	std::cout << "get lock" << std::endl;
}

int main() {
	std::unique_lock<std::mutex> lock_u(mtx);
	std::thread thSon(fun1);
	std::this_thread::sleep_for(std::chrono::milliseconds(1000));
	std::cout << "release" << std::endl;
	lock_u.release();
	thSon.join();
	std::cin.get();
}

-:std::unique_lock可以通过std::mutex* std::unique_lock.mutex()来获取内部锁的指针,这个方法,从自觉上看是非常危险的,因为这暴露了std::unique_lock内部的部分,使程序可以在std::unique_lock之外进行对被持有的锁进行操作;

-:std::unique_lock是可移动且不可拷贝的对象;

-:std::unique_lock的3个第二参数

        ·:std::defer_lock,作用是告诉构造函数,在构造的时候不要给获取锁的所有权,将会在后续的执行中进行获取。这里的一个应用是用std::lock给std::unique_lock上锁,因为将std::unique_lock传递给std::lock前,前者的锁不能是已经获取的状态

        ·:std::adopt_lock,作用是告诉构造函数,在构造之前,该锁的所有权就已经被获取,请不要尝试获取;

        ·:std::try_to_lock,作用是告诉构造函数,请尝试获取锁的所有权;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值