#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// 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;}参考文章:http://blog.csdn.net/feixiaoxing/article/details/7017727
新闻热点
疑难解答