📄 mutex.h
字号:
/* AscentEmu By SOI */
#ifndef _THREADING_MUTEX_H
#define _THREADING_MUTEX_H
class SERVER_DECL Mutex
{
public:
friend class Condition;
/** Initializes a mutex class, with InitializeCriticalSection / pthread_mutex_init
*/
Mutex();
/** Deletes the associated critical section / mutex
*/
~Mutex();
/** Acquires this mutex. If it cannot be acquired immediately, it will block.
*/
ASCENT_INLINE void Acquire()
{
#ifndef WIN32
pthread_mutex_lock(&mutex);
#else
EnterCriticalSection(&cs);
#endif
}
/** Releases this mutex. No error checking performed
*/
ASCENT_INLINE void Release()
{
#ifndef WIN32
pthread_mutex_unlock(&mutex);
#else
LeaveCriticalSection(&cs);
#endif
}
/** Attempts to acquire this mutex. If it cannot be acquired (held by another thread)
* it will return false.
* @return false if cannot be acquired, true if it was acquired.
*/
ASCENT_INLINE bool AttemptAcquire()
{
#ifndef WIN32
return (pthread_mutex_trylock(&mutex) == 0);
#else
return (TryEnterCriticalSection(&cs) == TRUE ? true : false);
#endif
}
protected:
#ifdef WIN32
/** Critical section used for system calls
*/
CRITICAL_SECTION cs;
#else
/** Static mutex attribute
*/
static bool attr_initalized;
static pthread_mutexattr_t attr;
/** pthread struct used in system calls
*/
pthread_mutex_t mutex;
#endif
};
#ifdef WIN32
class SERVER_DECL FastMutex
{
#pragma pack(push,8)
volatile long m_lock;
#pragma pack(pop)
DWORD m_recursiveCount;
public:
ASCENT_INLINE FastMutex() : m_lock(0),m_recursiveCount(0) {}
ASCENT_INLINE ~FastMutex() {}
ASCENT_INLINE void Acquire()
{
DWORD thread_id = GetCurrentThreadId(), owner;
if(thread_id == (DWORD)m_lock)
{
++m_recursiveCount;
return;
}
for(;;)
{
owner = InterlockedCompareExchange(&m_lock, thread_id, 0);
if(owner == 0)
break;
Sleep(0);
}
++m_recursiveCount;
}
ASCENT_INLINE bool AttemptAcquire()
{
DWORD thread_id = GetCurrentThreadId();
if(thread_id == (DWORD)m_lock)
{
++m_recursiveCount;
return true;
}
DWORD owner = InterlockedCompareExchange(&m_lock, thread_id, 0);
if(owner == 0)
{
++m_recursiveCount;
return true;
}
return false;
}
ASCENT_INLINE void Release()
{
if((--m_recursiveCount) == 0)
InterlockedExchange(&m_lock, 0);
}
};
#else
#define FastMutex Mutex
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -