Windows下的半自動線程鎖

關於IOCP的網絡庫,裏面必不可少的肯定會用到多線程,所以輕量級的線程鎖還是需要的,所以簡單寫了一個半自動的線程鎖,所謂半自動,就是要顯式的調用加鎖,但是不必手動釋放該鎖。以前學的基礎多線程中的都是顯式的加鎖,顯式的解鎖,比較繁瑣。我們這裏只是簡單的封裝了下而已。

Locker.h

/************************************************************************ 

	FileName:Locker.h
	Author	:eliteYang
	EMail	:elite_yang[at]163.com
	Copyright (C) http://www.cppfans.org
	This file is a part of FreeNet, provide a semi-automatic thread lock.

************************************************************************/
#pragma once

#include <Windows.h>

class CLocker
{
public:
	CLocker();
	~CLocker();

	void Lock();
	void UnLock();

private:
	CRITICAL_SECTION m_access;
};

//////////////////////////////////////////////////////////////////////////

class CAutoLocker
{
public:
	CAutoLocker( CLocker* pLocker );
	~CAutoLocker();
private:
	CLocker* m_pLocker;
};

這裏我們用到的是臨界區來加鎖。

Locker.cpp

#include "Locker.h"

CLocker::CLocker()
{
	::InitializeCriticalSection(&m_access);
}

CLocker::~CLocker()
{
	::DeleteCriticalSection(&m_access);
}

void CLocker::Lock()
{
	::EnterCriticalSection(&m_access);
}

void CLocker::UnLock()
{
	::LeaveCriticalSection(&m_access);
}

CAutoLocker::CAutoLocker(CLocker* pLocker)
{
	m_pLocker = pLocker;
	if (m_pLocker)
	{
		m_pLocker->Lock();
	}
}

CAutoLocker::~CAutoLocker()
{
	if (m_pLocker)
	{
		m_pLocker->UnLock();
	}
}

這樣的鎖,我們在調用的時候定義一個鎖對象,然後對其加鎖,然後在跳出大括號的時候因爲析構所以會自動解鎖。

 

簡單的使用例子:(注意:本例中的賦值操作是原子操作,不需要加鎖的,但是隻是展示如何使用的,所以就這樣寫了,大家千萬不要多此一舉啊)

#include "stdafx.h"
#include "Locker.h"

CLocker m_lock;

int _tmain(int argc, _TCHAR* argv[])
{
	CAutoLocker m_autoLocker(&m_lock);
	{
		int a = 0;
	}
	return 0;
}

轉載請註明:C++愛好者博客 » [源碼分享]Windows下的半自動線程鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章