双检锁模式学习

单例模式若处于多线程环境中,就需要使用到双检锁模式。如单例的创建过程如下:

    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处理器的平行特性.因此有可能破坏双检锁模式.

原文地址:https://www.cnblogs.com/fangkm/p/1489288.html