lock_guard原理解析

一、说明

lock_guard用来包装Mutex,实现Mutex的自动锁定和解锁。能保证锁定过程中逻辑异常也能自动解锁。

二、windows下的源码

template<class _Mutex>
	class lock_guard<_Mutex>
	{
    
    	// specialization for a single mutex
public:
	typedef _Mutex mutex_type;

	explicit lock_guard(_Mutex& _Mtx) //传的是引用
		: _MyMutex(_Mtx)
		{
    
    	// construct and lock
		_MyMutex.lock();
		}

	lock_guard(_Mutex& _Mtx, adopt_lock_t)
		: _MyMutex(_Mtx)
		{
    
    	// construct but don't lock
		}

	~lock_guard() _NOEXCEPT
		{
    
    	// unlock
		_MyMutex.unlock();
		}

	lock_guard(const lock_guard&) = delete;  //不能拷贝构造
	lock_guard& operator=(const lock_guard&) = delete; //不能赋值给其他对象
private:
	_Mutex& _MyMutex;
	};

三、源码解析

代码很简单,构造函数里调用mutex的lock,析构时调用mutex的unlock。代码抛异常的时候会析构栈上的对象,也就会自动调用mutex的unlock。

四、使用示例

class LockGuardTest
{
    
    
private:
	mutex _mutex;
	int count = 0;
public:
	void process()
	{
    
    
		
		for(int i=0;i<100000;i++)
		{
    
    
			{
    
    
				MyLockGuard<mutex> guard(_mutex);
				count++;
					
			}
		}
		
	}
	void doTest()
	{
    
    
		thread t1([this]() {
    
    this->process(); });
		thread t2([this]() {
    
    this->process(); });
		t1.join();
		t2.join();
		
	}
};

猜你喜欢

转载自blog.csdn.net/gamekit/article/details/107373134