#ifndef MUTEX_LOCK_H #define MUTEX_LOCK_H #ifndef WIN32 #include <windows.h> #endif #ifdef __unix #include <pthread.h> #endif // __unix class Mutex { public: Mutex(); ~Mutex(); void Lock(); void Unlock(); private: Mutex(const Mutex&); void operator=(const Mutex&); #ifdef WIN32 CRITICAL_SECTION m_mutex; #endif // WIN32 #ifdef __unix pthread_mutex_t m_mutex; #endif // __unix }; class MutexLock { public: explicit MutexLock(Mutex *mutex) :m_mutex(mutex) { m_mutex->Lock(); }; ~MutexLock() { m_mutex->Unlock(); }; private: // 不允许复制 MutexLock(const MutexLock&); void operator=(const MutexLock&); Mutex *m_mutex; }; #endif // !MUTEX_LOCK_Hmutex.cpp
#include "mutex.h" Mutex::Mutex() { #ifdef WIN32 InitializeCriticalSection(&m_mutex); #endif #ifdef __unix pthread_mutex_init(&m_mutex, NULL); #endif // __unix } Mutex::~Mutex() { #ifdef WIN32 DeleteCriticalSection(&m_mutex); #endif #ifdef __unix pthread_mutex_destroy(&m_mutex); #endif // __unix } void Mutex::Lock() { #ifdef WIN32 EnterCriticalSection(&m_mutex); #endif #ifdef __unix pthread_mutex_lock(&m_mutex); #endif // __unix } void Mutex::Unlock() { #ifdef WIN32 LeaveCriticalSection(&m_mutex); #endif #ifdef __unix pthread_mutex_unlock(&m_mutex); #endif // __unix }测试
Mutex mutex; void MutexTest() { MutexLock l(&mutex); static int i = 0; printf("i = %d\n", i); ++i; }原理就是,当MutexLock生命周期结束时,会调用析构函数,从而可以实现每次从卫生间出来都可以解锁。当然你可以在MutexText添加大括号({})来约束MetexLock的生命同期,从而减小锁的粒度。
原文地址:http://blog.csdn.net/yitouhan/article/details/34948239