class CLLog
{
public:
static CLLog* GetInstance();
static CLStatus WriteLogMsg(const char *pstrMsg, long lErrorCode);
CLStatus WriteLog(const char *pstrMsg, long lErrorCode);
private:
CLLog(const CLLog&);
CLLog& operator=(const CLLog&);
static pthread_mutex_t *InitializeMutex();
private:
CLLog();
~CLLog();
int m_Fd;
pthread_mutex_t *m_pMutexForFile;
static CLLog * volatile m_pLog;
static pthread_mutex_t *m_pMutex;
};
CLLog* volatile CLLog::m_pLog = 0;
pthread_mutex_t *CLLog::m_pMutex = CLLog::InitializeMutex();
注意:m_pMutexForFile是为每个文件互斥的,所以是成员变量
而m_pMutex是用于对保证了多线程环境下只会创建一个对象使用的。所以是静态成员变量。
m_pLog之所以是volatile的,是因为在多线程环境下防止其他线程已经构造了这个静态对象。
CLLog* CLLog::GetInstance()
{
if(m_pMutex == 0)
return 0;
int r = pthread_mutex_lock(m_pMutex);
if(r != 0)
return 0;
if(m_pLog == 0)
{
m_pLog = new CLLog;
}
r = pthread_mutex_unlock(m_pMutex);
if(r != 0)
return 0;
return m_pLog;
}
但每次读都需要加锁、解锁,效率不高
能否让后续的读操作,不再加锁
双重检测机制:
CLLog* CLLog::GetInstance()
{
if(m_pLog == 0)
{
if(m_pMutex == 0)
return 0;
int r = pthread_mutex_lock(m_pMutex);
if(r != 0)
return 0;
if(m_pLog == 0)
{
m_pLog = new CLLog;
}
r = pthread_mutex_unlock(m_pMutex);
if(r != 0)
return 0;
}
return m_pLog;
}