std::unique_lock源码解析

本文介绍了C++中std::unique_lock的用途和工作原理,详细解析了其构造函数和成员函数,展示了如何通过unique_lock管理互斥量的生命周期,以避免死锁和资源泄露。此外,文章还对比了unique_lock与lock_guard的差异,并提出constexpr元函数在构造函数中的作用,增强了代码的可读性和可维护性。
摘要由CSDN通过智能技术生成

      最近在阅读《c++并发编程实战中》发现了使用了unique_lock类,顺便查看源码,初步了解该类的一些功能,并尝试解析一下,源码如下:

	// LOCK PROPERTIES
struct adopt_lock_t
	{	// indicates adopt lock
	explicit adopt_lock_t() = default;
	};

struct defer_lock_t
	{	// indicates defer lock
	explicit defer_lock_t() = default;
	};

struct try_to_lock_t
	{	// indicates try to lock
	explicit try_to_lock_t() = default;
	};

_INLINE_VAR constexpr adopt_lock_t adopt_lock{};
_INLINE_VAR constexpr defer_lock_t defer_lock{};
_INLINE_VAR constexpr try_to_lock_t try_to_lock{};

template<class _Mutex>
	class unique_lock
	{	// whizzy class with destructor that unlocks mutex
public:
	typedef _Mutex mutex_type;

	// CONSTRUCT, ASSIGN, AND DESTROY
	unique_lock() noexcept
		: _Pmtx(nullptr), _Owns(false)
		{	// default construct
		}

    /* 避免隐式转换,即 unique_lock k; unqiue_lock f =k;非法(不过感觉不可能毕竟后面已经
       delete掉正牌拷贝构造函数了) */
	explicit unique_lock(_Mutex& _Mtx) 
		: _Pmtx(_STD addressof(_Mtx)), _Owns(false)
		{	// construct and lock
		_Pmtx->lock();
		_Owns = true;
		}

	unique_lock(_Mutex& _Mtx, adopt_lock_t)
		: _Pmtx(_STD addressof(_Mtx)), _Owns(true)
		{	// construct and assume already locked
		}

	unique_lock(_Mutex& _Mtx, defer_lock_t) noexcept
		: _Pmtx(_STD addressof(_Mtx)), _Owns(false)
		{	// construct but don't lock
		}

	unique_lock(_Mutex& _Mtx, try_to_lock_t)
		: _Pmtx(_STD addressof(_Mtx)), _Owns(_Pmtx->try_lock())
		{	// construct and try to lock
		}

	template<class _Rep,
		class _Period>
		unique_lock(_Mutex& _Mtx,
			const chrono::duration<_Rep, _Period>& _Rel_time)
		: _Pmtx(_STD addressof(_Mtx)), _Owns(_Pmtx->try_lock_for(_Rel_time))
		{	// construct and lock with timeout
		}

	template<class _Clock,
		class _Duration>
		unique_lock(_Mutex& _Mtx,
			const chrono::time_point<_Clock, _Duration>& _Abs_time)
		: _Pmtx(_STD addressof(_Mtx)), _Owns(_Pmtx->try_lock_until(_Abs_time))
		{	// construct 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值