mutex.cpp
来自「天之炼狱1服务器端源文件游戏服务端不完整」· C++ 代码 · 共 162 行
CPP
162 行
//////////////////////////////////////////////////////////////////////////////// Filename : Mutex.cpp// Written By : reiot@ewestsoft.com// Description ://////////////////////////////////////////////////////////////////////////////#include "Mutex.h"#include "MutexAttr.h"#include "pthreadAPI.h"#include "Thread.h"#include "LogClient.h"#include "StringStream.h"//////////////////////////////////////////////////////////////////////////////////// constructor//////////////////////////////////////////////////////////////////////////////////Mutex::Mutex ( MutexAttr * attr ) throw ( Error ){ __BEGIN_TRY pthreadAPI::pthread_mutex_init_ex( &m_Mutex , ( attr == NULL ? NULL : attr->getAttr() ) ); m_LockTID = -1; __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// destructor//////////////////////////////////////////////////////////////////////////////////Mutex::~Mutex () throw ( Error ){ __BEGIN_TRY try { pthreadAPI::pthread_mutex_destroy_ex( &m_Mutex ); } catch ( MutexException & me ) { cerr << me.toString() << endl; throw Error(me.toString()); } __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// lock mutex//////////////////////////////////////////////////////////////////////////////////void Mutex::lock () throw ( Error ){ __BEGIN_TRY //filelog("lock.txt", "Thread[%d][%s] waiting lock", Thread::self(), m_Name.c_str()); try { int TID = Thread::self(); if (TID != m_LockTID) { m_LockTID = TID; pthreadAPI::pthread_mutex_lock_ex( &m_Mutex ); } else { cerr << "Mutex::lock() : SELF DEAD LOCK [" << m_Name << "]" << endl; filelog("MutexError.log", "Mutex::lock() : SELF DEAD LOCK [%s]", m_Name.c_str()); throw Error("Mutex::lock() : SELF DEAD LOCK"); } } catch ( MutexException & me ) { cerr << me.toString() << endl; throw Error(me.toString()); } //filelog("lock.txt", "Thread[%d][%s] gain lock", Thread::self(), m_Name.c_str()); __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// if mutex is locked, throw MutexException. else lock mutex//////////////////////////////////////////////////////////////////////////////////void Mutex::trylock () throw ( Error ){ __BEGIN_TRY //filelog("lock.txt", "Thread[%d][%s] trying to gain lock", Thread::self(), m_Name.c_str()); try { int TID = Thread::self(); if (TID != m_LockTID) { m_LockTID = TID; pthreadAPI::pthread_mutex_trylock_ex( &m_Mutex ); } else { cerr << "Mutex::trylock() : SELF DEAD LOCK [" << m_Name << "]" << endl; filelog("MutexError.log", "Mutex::trylock() : SELF DEAD LOCK [%s]", m_Name.c_str()); throw Error("Mutex::trylock() : SELF DEAD LOCK"); } } catch ( MutexException & me ) { cerr << me.toString() << endl; throw Error(me.toString()); } //filelog("lock.txt", "Thread[%d][%s] gain lock", Thread::self(), m_Name.c_str()); __END_CATCH}//////////////////////////////////////////////////////////////////////////////////// unlock mutex//////////////////////////////////////////////////////////////////////////////////void Mutex::unlock () throw ( Error ){ __BEGIN_TRY try { pthreadAPI::pthread_mutex_unlock_ex( &m_Mutex ); m_LockTID = -1; } catch ( MutexException & me ) { cerr << me.toString() << endl; throw Error(me.toString()); } //filelog("lock.txt", "Thread[%d][%s] release lock", Thread::self(), m_Name.c_str()); __END_CATCH}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?