跨平台lock
/*================================================================ * Copyright (C) 2016 All rights reserved. * * filename:lock.h * author:Jiang Canjun * create date:2016-6-24 ================================================================*/ #pragma once #ifdef WIN32 #include<Windows.h> #else #include <pthread.h> #endif //********************************************************************** //处理读写锁的区别 //********************************************************************** #ifdef WIN32 //适用于vista以及server 2008及以上系统 #define RWLOCK_VAR SRWLOCK #define INIT_RWLOCK_VAR(v) InitializeSRWLock(&(v)) #define ENTER_READ_LOCK_VAR(v) AcquireSRWLockShared(&(v)) #define LEAVE_READ_LOCK_VAR(v) ReleaseSRWLockShared(&(v)) #define ENTER_WRITE_LOCK_VAR(v) AcquireSRWLockExclusive(&(v)) #define LEAVE_WRITE_LOCK_VAR(v) ReleaseSRWLockExclusive(&(v)) #define DELETE_RWLOCK_VAR(v) #else #define RWLOCK_VAR pthread_rwlock_t #define INIT_RWLOCK_VAR(v) pthread_rwlock_init(&(v), NULL) #define ENTER_READ_LOCK_VAR(v) pthread_rwlock_rdlock(&(v)) #define LEAVE_READ_LOCK_VAR(v) pthread_rwlock_unlock(&(v)) #define ENTER_WRITE_LOCK_VAR(v) pthread_rwlock_wrlock(&(v)) #define LEAVE_WRITE_LOCK_VAR(v) pthread_rwlock_unlock(&(v)) #define DELETE_RWLOCK_VAR(v) pthread_rwlock_destroy(&(v)) #endif #ifdef WIN32 #define thread_t DWORD #define create_thread(id,attr,handler,arg) CreateThread(NULL, 0, handler, arg, 0, &id) #define exit_thread(v) ExitThread((v)) #define thread_id() GetCurrentThreadId() #else #define thread_t pthread_t #define create_thread(id,attr,handler,arg) pthread_create(&id, attr, handler, arg) #define exit_thread(v) pthread_exit(&(v)) #define thread_id() pthread_self() #endif #ifdef WIN32 //适用于vista以及server 2008及以上系统 #define cond_t CONDITION_VARIABLE #define init_cond(c) InitializeConditionVariable(&c) #define wait_cond(c,m) SleepConditionVariableCS(&c, &m, 2*1000) #define signal_cond(c) WakeConditionVariable(&c) #define broadcast_cond(c) WakeAllConditionVariable(&c) #define destroy_cond(c) #else #define cond_t pthread_cond_t #define init_cond(c) pthread_cond_init(&(c), NULL) #define wait_cond(c,m) pthread_cond_wait(&(c),&(m)) #define signal_cond(c) pthread_cond_signal(&(c)) #define broadcast_cond(c) pthread_cond_broadcast(&(c)) #define destroy_cond(c) pthread_cond_destroy(&(c)) #endif #ifdef WIN32 #define mutex_t CRITICAL_SECTION #define init_mutex(v) InitializeCriticalSection(&(v)) #define lock_mutex(v) EnterCriticalSection(&(v)) #define unlock_mutex(v) LeaveCriticalSection(&(v)) #define try_lock_mutex(v) TryEnterCriticalSection(&(v)) #define destroy_mutex(v) DeleteCriticalSection(&(v)) #else #define mutex_t pthread_mutex_t #define init_mutex(v) pthread_mutex_init(&(v),NULL) #define lock_mutex(v) pthread_mutex_lock(&(v)) #define unlock_mutex(v) pthread_mutex_unlock(&(v)) #define try_lock_mutex(v) !pthread_mutex_trylock(&(v)) #define destroy_mutex(v) pthread_mutex_destroy(&(v)) #endif class CLock { public: CLock(); virtual ~CLock(); void lock(); void unlock(); mutex_t getMutex() { return m_lock; } virtual bool try_lock(); private: mutex_t m_lock; }; class CRWLock { public: CRWLock(); virtual ~CRWLock(); void rlock(); void wlock(); void unrlock(); void unwlock(); private: RWLOCK_VAR m_lock; }; class CAutoRWLock { public: CAutoRWLock(CRWLock* pLock, bool bRLock = true); virtual ~CAutoRWLock(); private: CRWLock* m_pLock; bool m_bRLock; }; class CAutoLock { public: CAutoLock(CLock* pLock); virtual ~CAutoLock(); private: CLock* m_pLock; };
#include "Lock.h" CLock::CLock() { init_mutex(m_lock); } CLock::~CLock() { destroy_mutex(m_lock); } void CLock::lock() { lock_mutex(m_lock); } void CLock::unlock() { unlock_mutex(m_lock); } bool CLock::try_lock() { return try_lock_mutex(m_lock); } CRWLock::CRWLock() { INIT_RWLOCK_VAR(m_lock); } CRWLock::~CRWLock() { DELETE_RWLOCK_VAR(m_lock); } void CRWLock::rlock() { ENTER_READ_LOCK_VAR(m_lock); } void CRWLock::wlock() { ENTER_WRITE_LOCK_VAR(m_lock); } void CRWLock::unrlock() { LEAVE_READ_LOCK_VAR(m_lock); } void CRWLock::unwlock() { LEAVE_WRITE_LOCK_VAR(m_lock); } CAutoRWLock::CAutoRWLock(CRWLock* pLock, bool bRLock) { m_bRLock = bRLock; m_pLock = pLock; if(NULL != m_pLock) { if (bRLock) { m_pLock->rlock(); } else { m_pLock->wlock(); } } } CAutoRWLock::~CAutoRWLock() { if(NULL != m_pLock) { if (m_bRLock) { m_pLock->unrlock(); } else { m_pLock->unwlock(); } } } CAutoLock::CAutoLock(CLock* pLock) { m_pLock = pLock; if(NULL != m_pLock) m_pLock->lock(); } CAutoLock::~CAutoLock() { if(NULL != m_pLock) m_pLock->unlock(); }
posted on 2016-12-21 16:41 jiangcanjun 阅读(186) 评论(0) 收藏 举报