📄 sync_ctrl.hpp
字号:
// sync_ctrl class by David Maisonave (Axter)
// Copyright (C) 2005
// David Maisonave (Axter) (609-345-1007) (www.axter.com)
#ifndef SYNC_CTRL_H_BY_DAVID_MAISONAVE_HEADER_GUARD_
#define SYNC_CTRL_H_BY_DAVID_MAISONAVE_HEADER_GUARD_
/*! @class sync_ctrl
@brief sync_ctrl is an interface class used by sync_ptr.
This interface class is used to separate implementation
lock details from the sync_ptr class.
*/
class sync_ctrl
{
public:
virtual void lock()=0;
virtual void unlock()=0;
virtual bool trylock()=0;
virtual ~sync_ctrl(){}
};
#ifdef _WIN32
class sync_ctrl_mutex : public sync_ctrl
{
public:
sync_ctrl_mutex(LPCTSTR lpName = NULL, LPSECURITY_ATTRIBUTES lpMutexAttributes = NULL):m_hndl(CreateMutex(lpMutexAttributes, FALSE, lpName)){}
~sync_ctrl_mutex()
{
ReleaseMutex(m_hndl);
CloseHandle(m_hndl);
}
void lock(){WaitForSingleObject(m_hndl, INFINITE);}
void unlock(){ReleaseMutex(m_hndl);}
bool trylock()
{
DWORD GoodLock = WaitForSingleObject(m_hndl, 1);
return (GoodLock == WAIT_OBJECT_0);
}
private:
HANDLE m_hndl;
};
#if(_WIN32_WINNT >= 0x0400)
class sync_ctrl_win32_critical : public sync_ctrl
{
public:
sync_ctrl_win32_critical(){InitializeCriticalSection(&m_cs);}
~sync_ctrl_win32_critical(){DeleteCriticalSection(&m_cs);}
void lock(){EnterCriticalSection(&m_cs);}
void unlock(){LeaveCriticalSection(&m_cs);}
bool trylock()
{
//For VC++ 6.0, TryEnterCriticalSection requires _WIN32_WINNT>=0x0400
BOOL GoodLock = TryEnterCriticalSection(&m_cs); //For VC++ 6.0, add (_WIN32_WINNT=0x0400) to preprocessor definition compile settings
return (GoodLock == TRUE);
}
private:
CRITICAL_SECTION m_cs;
};
typedef sync_ctrl_win32_critical sync_ctrl_default;
#else
typedef sync_ctrl_mutex sync_ctrl_default;
#endif /* _WIN32_WINNT >= 0x0400 */
#else //_WIN32
// @cond INCLUDE_ALL_OBJS_
//Do POSIX sync
class sync_ctrl_posix_mutex : public sync_ctrl
{
public:
sync_ctrl_posix_mutex():m_mutex(PTHREAD_MUTEX_INITIALIZER){}
~sync_ctrl_posix_mutex(){pthread_mutex_destroy(&m_mutex);}
void lock(){pthread_mutex_lock(&m_mutex);}
void unlock(){pthread_mutex_unlock(&m_mutex);}
bool trylock()
{
int GoodLock = pthread_mutex_trylock(&m_mutex);
return (GoodLock != EBUSY );
}
private:
pthread_mutex_t m_mutex;
};
typedef sync_ctrl_posix_mutex sync_ctrl_default;
// @endcond
#endif //_WIN32
#endif //!SYNC_CTRL_H_BY_DAVID_MAISONAVE_HEADER_GUARD_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -