zoukankan      html  css  js  c++  java
  • 双检锁模式学习

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

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

  • 相关阅读:
    asp.net 页面定时跳转的小技巧
    获得 Windows phone 设备的信息
    如何自定义ToggleSwitch控件样式(转)
    云推送注意(MSDN链接)
    回顾:线程和进程的区别
    WebGL
    13种提升基于MVVM模式的WP7程序性能的方法(转)
    sample_code
    网址收藏
    Net中de日期格式
  • 原文地址:https://www.cnblogs.com/fangkm/p/1489288.html
Copyright © 2011-2022 走看看