2013-01-23 47 views
0

我在C++中看到了經典的單例模式類。我的理解是這個實現是線程安全的。然後我讀,如果這個類包含在2個DLL和兩者都在1個加載應用程序,你會得到靜態變量的2份因此S級的2個實例,因此它不完全是線程安全的。C++中的經典單例模式

那麼解決方案仍在使用互斥鎖? (我知道這是在C#中常見的做法,在詳細:http://csharpindepth.com/Articles/General/Singleton.aspx

class S 
{ 
    public: 
     static S& getInstance() 
     { 
      static S instance; 
      return instance; 
     } 
    private: 
     S(); 
     S(S const&);    // Don't Implement 
     void operator=(S const&); // Don't implement 
}; 
+0

參見:http://stackoverflow.com/questions/1008019/c-singleton-design-pattern – MatthewD

回答

3

一個靜態變量的作用域是它的編譯單元

如果你有2倍的DLL編譯2的代碼塊包含靜態成員(。或者更糟,你擁有了它在頭....),那麼這兩個DLL文件將與該變量進行編譯。

無鎖將改變這一事實。

0

這是C++

單碼0
#include<iostream> 
using namespace std; 
class singletonClass 
{ 


    static int i; 
    static singletonClass* instance; 
public: 


    static singletonClass* createInstance() 
    { 


     if(i==0) 
     { 

      instance =new singletonClass; 
      i=1; 

     } 

     return instance; 

    } 
    void test() 
    { 

     cout<<"successfully created instance"; 
    } 
}; 

int singletonClass::i=0; 
singletonClass* singletonClass::instance=NULL; 
int main() 
{ 


    singletonClass *temp=singletonClass::createInstance();//////return instance!!! 
    temp->test(); 
} 

感謝