• 双检锁模式学习


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

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

  • 相关阅读:
    STR[#6]
    整数
    一些应该记住的东西(持续更新?再也不会更新了)
    退役后的续命杂谈
    51Nod 快速傅里叶变换题集选刷
    支配树学习笔记
    动态点分治入门随讲
    KD树小结
    HNOI2013 BZOJ3142 数列
    BZOJ2001 HNOI2010 城市建设
  • 原文地址:https://www.cnblogs.com/fangkm/p/1489288.html
Copyright © 2020-2023  润新知