C++跨平臺互斥鎖實現
阿新 • • 發佈:2019-01-02
CMyLock.h
#ifndef __CMYLOCK_H__ #define __CMYLOCK_H__ #ifndef _WIN32 #include <pthread.h> #else #include <windows.h> #endif class ILock { public: virtual ~ILock() {}; virtual void Lock() const = 0; virtual void UnLock() const = 0; }; class CLock : public ILock { public: CLock(); ~CLock(); virtual void Lock() const; virtual void UnLock() const; private: #ifndef _WIN32 mutable pthread_mutex_t m_mutex; #else HANDLE m_mutex; #endif }; class CMyLock { public: CMyLock(const ILock&); ~CMyLock(); private: const ILock& m_lock; }; #endif
CMyLock.cpp
#include "CMyLock.h" CLock::CLock() { #ifndef _WIN32 pthread_mutex_init(&m_mutex, NULL); #else m_mutex = ::CreateMutex(NULL, false, NULL); #endif } CLock::~CLock() { #ifndef _WIN32 pthread_mutex_destroy(&m_mutex); #else ::CloseHandle(m_mutex); #endif } void CLock::Lock() const { #ifndef _WIN32 pthread_mutex_lock(&m_mutex); #else DWORD dw = WaitForSingleObject(m_mutex, INFINITE); #endif } void CLock::UnLock() const { #ifndef _WIN32 pthread_mutex_unlock(&m_mutex); #else ::ReleaseMutex(m_mutex); #endif } CMyLock::CMyLock(const ILock& m) : m_lock(m) { m_lock.Lock(); } CMyLock::~CMyLock() { m_lock.UnLock(); }