说明:文件名的GS前缀不代表任何含义
这里的锁类暂时只支持windows平台。
GSMutex.h
#pragma once
#include <windows.h>
#include <WinBase.h>
class GSMutex
{
public:
GSMutex(void);
~GSMutex(void);
void Lock(); //加锁
void Unlock(); //解锁
bool TryLock(); //true获取锁成功,false失败
private:
CRITICAL_SECTION m_hOS;
};
class GSAutoMutex
{
public:
GSAutoMutex(GSMutex& mutex);
~GSAutoMutex(void);
private :
GSMutex& m_mutex;
};
GSMutex.cpp
#include "StdAfx.h"
#include "GSMutex.h"
GSMutex::GSMutex(void)
{
InitializeCriticalSection(&m_hOS);
}
GSMutex::~GSMutex(void)
{
DeleteCriticalSection(&m_hOS);
}
void GSMutex::Lock()
{
EnterCriticalSection(&m_hOS);
}
void GSMutex::Unlock()
{
LeaveCriticalSection(&m_hOS);
}
bool GSMutex::TryLock()
{
if (!TryEnterCriticalSection(&m_hOS))
{
return false;
}
return true;
}
GSAutoMutex::GSAutoMutex(GSMutex& mutex)
:m_mutex(mutex)
{
m_mutex.Lock();
}
GSAutoMutex::~GSAutoMutex(void)
{
m_mutex.Unlock();
}
// LockTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <windows.h>
#include <WinBase.h>
#include <process.h>
#include "GSMutex.h"
GSMutex cs;
unsigned int WINAPI ThreadFuncA(LPVOID lp)
{
GSAutoMutex csAuto(cs);
Sleep(3000);
printf("This is threadA\n");
return 0;
}
unsigned int WINAPI ThreadFuncB(LPVOID lp)
{
GSAutoMutex csAuto(cs);
printf("This is threadB\n");
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThreadHandleArry[2];
memset(hThreadHandleArry, 0, sizeof(HANDLE)*2);
hThreadHandleArry[0] = (HANDLE)_beginthreadex(NULL, 0, ThreadFuncA, NULL, 0, 0);
hThreadHandleArry[1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFuncB, NULL, 0, 0);
WaitForMultipleObjects(2, hThreadHandleArry, TRUE, INFINITE);
for (int i = 0; i < 2; i++)
{
if (hThreadHandleArry[i] != NULL)
{
//关闭线程句柄,不会导致线程关闭
CloseHandle(hThreadHandleArry[i]);
hThreadHandleArry[i] = NULL;
}
}
system("pause");
return 0;
}