码迷,mamicode.com
首页 > 编程语言 > 详细

[杂谈]C++的双重检查锁并不安全

时间:2017-01-19 02:04:32      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:++   否则   com   single   return   code   nbsp   aic   null   

原文地址

http://www.cnblogs.com/hebaichuanyeah/p/6298513.html

一个典型的单例模式构建对象的双重检查锁如下:

    static Singleton * getSingleObject()
    {
        if(singleObject==NULL)
        {
            lock();
            if(singleObject==NULL)
            {
                singleObject = new Singleton();
            }
            unlock();
        }
        return singleObject;
    }

该代码的逻辑是:getSingleObject()函数获得对象,如果对象不存在则创建,反之则直接返回。考虑到线程安全,创建对象时需要加锁(否则可能多线程同时调用该函数时创建多个对象)。同时为了避免线程每次调用getSingleObject()函数时候都要被锁住等待,减小线程间的开销,使用双重检查锁,即只有对象不存在时才锁住等待。

 

看起来天衣无缝……

 

C++在new一个对象时,首先会把指针指向分配的那块空间,然后在初始化该空间。

这样假设线程A执行到new该对象时,分配了指针,但是还未来得及构建那块空间。此时线程B执行getSingleObject()函数,由于指针已经分配所以直接返回该地址(但其实是一块还未初始化的地址),线程B操作该地址,game over。。

[杂谈]C++的双重检查锁并不安全

标签:++   否则   com   single   return   code   nbsp   aic   null   

原文地址:http://www.cnblogs.com/hebaichuanyeah/p/6298513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!