对于C++锁的封装及使用

    xiaoxiao2021-03-26  26

    说明:文件名的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 // 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
    转载请注明原文地址: https://ju.6miu.com/read-661383.html

    最新回复(0)