0

我见过 C++ 中的经典单例类。我的理解是这个实现是线程安全的。然后我读到,如果这个类包含在 2 个 DLL 中并且两者都加载到 1 个应用程序中,您将获得 2 个静态变量副本,因此是 S 类的 2 个实例,因此它不是完全线程安全的。

那么解决方案还是使用互斥锁?(我知道这是 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
};
4

2 回答 2

3

静态变量的作用域是它的编译单元。

如果您有 2 个 dll 编译 2 个包含该静态成员的代码块(或者更糟糕的是,您将它放在头文件中......)那么两个 dll 都将使用该变量进行编译。

没有锁会改变这一事实。

于 2013-01-23T20:47:44.897 回答
0

这是 C++ 中的单例代码

#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();
}

谢谢

于 2013-04-02T15:24:29.793 回答