CMCore/inc/hgl/thread/SemLock.h

234 lines
5.9 KiB
C
Raw Permalink Normal View History

#ifndef HGL_THREAD_SEM_LOCK_INCLUDE
2019-08-19 19:19:58 +08:00
#define HGL_THREAD_SEM_LOCK_INCLUDE
#include<hgl/thread/Semaphore.h>
#include<hgl/thread/ThreadMutex.h>
#include<hgl/thread/RWLock.h>
namespace hgl
{
template<typename T,typename L> class SemLockTemplate
{
protected:
T data;
L lock;
Semaphore sem;
public:
SemLockTemplate(){}
/**
*
* @param d
* @param sem_count (0)
*/
SemLockTemplate(T &d,int sem_count=0):sem(sem_count)
{
data=d;
}
public: //数据相关
void operator = (T &d){data=d;}
T *operator->(){return &data;}
public: //信号相关
/**
*
* @param n
* @return
*/
bool Post(int n=1)
{
if(n<=0)return(false);
return sem.Post(n);
}
bool TryAcquire(){return sem.TryAcquire();} ///<尝试获取一个信号
/**
*
* @param time_out
* @return
*/
bool Acquire(double time_out=0.0f){return sem.Acquire(time_out);}
2019-08-19 19:19:58 +08:00
};//template<typename T,typename L> class SemLockTemplate
/**
* 线
*/
template<typename T> class SemThreadMutex:public SemLockTemplate<T,ThreadMutex>
{
public:
using SemLockTemplate<T,ThreadMutex>::SemLockTemplate;
public: //线程排斥相关
void Lock(){this->lock.Lock();} ///<取得的控制权(如果对象处于排斥状态,则等待)
bool TryLock(){return this->lock.TryLock();} ///<尝试取得控制权
bool WaitLock(double time_out=0){return this->lock.WaitLock();} ///<等待并取得控制权
void Unlock(){this->lock.Unlock();} ///<放弃控制权
public: //综合应用相关
/**
*
* @param time_out
* @return
*/
bool WaitSemLock(double time_out)
{
if(!this->sem.Acquire(time_out))
return(false);
this->lock.Lock();
return(true);
}
/**
*
* @return
*/
bool TrySemLock()
{
if(!this->sem.TryAcquire())
return(false);
this->lock.Lock();
return(true);
}
/**
*
* @param try_lock
* @param time_out
*/
bool SemLock(bool try_lock,double time_out)
{
if(try_lock)
{
if(!this->sem.TryAcquire())
return(false);
}
else //当前没人,那就慢慢等吧
{
if(!this->sem.Acquire(time_out))
return(false);
}
this->lock.Lock();
return(true);
}
/**
*
* @param n
*/
void SemUnlock(int n=1)
{
this->lock.Unlock();
if(n>0)
this->sem.Post(n);
}
};//template<typename T> class SemThreadMutex
/**
*
*/
template<typename T> class SemRWLock:public SemLockTemplate<T,RWLock>
{
public:
using SemLockTemplate<T,RWLock>::SemLockTemplate;
public: //读写锁相关
HGL_RWLOCK(this->lock);
public: //综合应用相关
/**
*
* @param time_out
* @return
*/
bool WaitSemReadLock(double time_out)
{
if(!this->sem.Acquire(time_out))
return(false);
this->lock.ReadLock();
return(true);
}
/**
*
* @param time_out
* @return
*/
bool WaitSemWriteLock(double time_out)
{
if(!this->sem.Acquire(time_out))
return(false);
this->lock.WriteLock();
return(true);
}
/**
*
* @return
*/
bool TrySemReadLock()
{
if(!this->sem.TryAcquire())
return(false);
this->lock.ReadLock();
return(true);
}
/**
*
* @return
*/
bool TrySemWriteLock()
{
if(!this->sem.TryAcquire())
return(false);
this->lock.WriteLock();
return(true);
}
/**
*
* @param n
*/
void SemReadUnlock(int n=1)
{
this->lock.ReadUnlock();
if(n>0)
this->sem.Post(n);
}
/**
*
* @param n
*/
void SemWriteUnlock(int n=1)
{
this->lock.WriteUnlock();
if(n>0)
this->sem.Post(n);
}
};//template<typename T> class SemRWLock
}//namespace hgl
#endif//HGL_THREAD_SEM_LOCK_INCLUDE