双检锁模式学习
单例模式若处于多线程环境中,就需要使用到双检锁模式。如单例的创建过程如下:
static CSingleton* GetInstance()
{
if( m_pInstance == NULL ) //----- 1------
{
CAutoLock lock( &cs ); //----- 2------
if( m_pInstance == NULL ) //----- 2------
{
m_pInstance = new CSingleton;
}
}
return m_pInstance;
}
语句1处的检测语句功能在于防止频繁的加锁解锁,虽然用户方式的关键段同步比事件、互斥对象要快,要毕竟属于系统资源,肯定比直接检测m_pInstance是否为NULL要慢的多.
语句2是同步语句,锁定资源以供某一线程操作
语句3,执行到该语句时,由于不存在多线程的竞争了,检测m_pInstance的状态也为当前确切的状态.
PS:精简指令集(RISC)机器的编译器会重新排列编译器生成的汇编语言指令,从而使代码能够最佳运用RISC处理器的平行特性.因此有可能破坏双检锁模式.