我们经常看到这么一种用法,即有的函数中一般采用一种Sentry(哨所)的方式对这一函数进行资源控制。
这种控制逻辑,一般是建立此Sentry类时,在构造函数与析构函数中实现加锁与解锁的过程。那么在函数中构建的Sentry对象时,作为局部变量,在函数中创建实现构造函数,函数执行完毕后进行析构函数。
运行示例如下所示:
//MyMutex.h
#pragma once
#include <Windows.h>
class CMyMutex
{
public:
CMyMutex(void);
~CMyMutex(void);
inline HANDLE& GetHandle()
{
return m_mutex;
}
void Lock();
bool TryLock();
void Unlock();
private:
HANDLE m_mutex;
};
class CMyMutex_Sentry
{
public:
CMyMutex_Sentry(CMyMutex& mutex);
~CMyMutex_Sentry();
private:
CMyMutex& m_mutex;
};
//MyMutex.cpp
#include "MyMutex.h"
CMyMutex::CMyMutex(void)
: m_mutex(NULL)
{
m_mutex = CreateMutex(NULL, FALSE, NULL);
}
CMyMutex::~CMyMutex(void)
{
if( NULL != m_mutex )
{
CloseHandle(m_mutex);
m_mutex = NULL;
}
}
void CMyMutex::Lock()
{
WaitForSingleObject(m_mutex, INFINITE);
}
bool CMyMutex::TryLock()
{
if( WAIT_OBJECT_0 == WaitForSingleObject(m_mutex, 0) )
{
return true;
}
else
{
return false;
}
}
void CMyMutex::Unlock()
{
ReleaseMutex(m_mutex);
}
CMyMutex_Sentry::CMyMutex_Sentry(CMyMutex& mutex)
:m_mutex(mutex)
{
m_mutex.Lock();
}
CMyMutex_Sentry::~CMyMutex_Sentry()
{
m_mutex.Unlock();
}
//MutexDemo.cpp
#include "MyMutex.h"
#include <process.h>
#include <iostream>
using namespace std;
HANDLE hThread[2];
unsigned threadid[2];
CMyMutex g_mutex;
unsigned __stdcall Fun1Proc(LPVOID lpParam);
unsigned __stdcall Fun2Proc(LPVOID lpParam);
void PrintMsg(int id,int i);
int main()
{
hThread[0] = (HANDLE)_beginthreadex(NULL,0,Fun1Proc,NULL,0,&threadid[0]);
hThread[1] = (HANDLE)_beginthreadex(NULL,0,Fun2Proc,NULL,0,&threadid[1]);
Sleep(100);
return 0;
}
unsigned __stdcall Fun1Proc(LPVOID lpParam)
{
for (int i=0;i<10;i++)
{
PrintMsg(2,i);
}
return 0;
}
unsigned __stdcall Fun2Proc(LPVOID lpParam)
{
for (int i=0;i<10;i++)
{
PrintMsg(1,i);
}
return 0;
}
void PrintMsg(int id,int i)
{
CMyMutex_Sentry m_Mutex(g_mutex);
cout<<"thread "<<threadid[id]<<" index "<<i<<endl;
}
执行结果: