關於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下的半自動線程鎖