2013-10-11 97 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在其編譯器支持這一點。