2013-10-11 49 views
0
Singleton* Singleton::instance() { 

if (pInstance == 0) { 

    Lock lock; 

    if (pInstance == 0) { 

     Singleton* temp = new Singleton; // initialize to temp 
     pInstance = temp; // assign temp to pInstance 
    } 
    } 

假设编译器没有优化冗余温度。 线程A进入并分配并构造了Singleton对象,该对象由temp指向。 现在A被抢先。 现在线程B获取锁,进入并检查pInstance是否为NULL。它也会创建Singleton对象并覆盖现有的指针。我想现在有一个内存泄漏。你有什么意见 ? 完整的数据源代码在这里: 代码参考:http://erdani.com/publications/DDJ_Jul_Aug_2004_revised.pdf单线程实现多线程环境的内存泄漏

+1

请再次阅读您链接的文章。 –

回答

1

不可以。当A被中断时,它拥有锁。因此B必须等到A释放锁定,然后分配pInstance并且B的第二次检查null将失败。

1

在C++ 11中,标准规定在第6.7段是:

这样的变量被初始化首次控制穿过 其声明;这样的变量在其初始化完成时被认为初始化。 [...]如果控制在初始化变量时同时输入 声明,则并发执行应等待初始化完成。

该实现不能在执行初始化程序时执行 周围引入任何死锁。

这导致了以下非常简单的,线程安全的单方法实现:

Singleton* Singleton::instance() { 
    Singleton instance; 
    return &instance; 
} 

详情请参阅this question在其编译器支持这一点。