Singleton类无法按预期工作C ++

时间:2018-09-21 07:52:54

标签: c++ design-patterns singleton

我正在一个涉及创建单例类的项目中。因此,我为单例类创建了一个共享库,并创建了两个使用该类的二进制文件。当第一个exe调用类的静态函数“ getInstance()”时,会创建一个Singleton的新实例,这是预期的,但是当我从第二个exe调用getInstance()时,又会创建一个Singleton的新实例,理想情况下,它应该已经返回了在第一种情况下创建的实例。这是他的代码

singelton.h:

#include <iostream>
#include <stdio.h>

using namespace std;

class Singleton
{
private:
    static Singleton *single;
    Singleton()
    {
        //private constructor
    }
public:
    static Singleton* getInstance();
    void method();
    ~Singleton()
    {
    }
};

singleton.cpp

#include "singleton.h"

Singleton* Singleton::single = NULL;
Singleton* Singleton::getInstance()
{
    if(single == NULL)
    {
        printf("Creating a new instance of singleton\n");
        single = new Singleton();
        return single;
    }
    else
    {
        return single;
    }
}

void Singleton::method()
{
    cout << "Method of the singleton class" << endl;
}

main_test1.cpp:

#include "singleton.h"

int main()
{
    printf("entering test1\n");
    Singleton* singleton = Singleton::getInstance();

    if(singleton != NULL)
    {
        singleton->method();
    }

    while(1)
    {
        sleep(60);
    }
}

main_test2.cpp:

#include "singleton.h"

int main()
{
    printf("entering test2\n");
    Singleton* singleton = Singleton::getInstance();

    if(singleton != NULL)
    {
        singleton->method();
    }
}

Makefile:

DEPS = singleton.h
CC = gcc

shared :  $(DEPS)
    $(CC) -o libsingleton.so singleton.cpp -fPIC -shared

test1 : main_test1.o libsingleton.so
    $(CC) -o test1 main_test1.o libsingleton.so -lstdc++ -rdynamic

test2 : main_test2.o libsingleton.so
    $(CC) -o test2 main_test2.o libsingleton.so -lstdc++ -rdynamic

clean : 
    rm *.o test2 test1 libsingleton.so

.PHONY : clean

预期结果:

$./test1&
$ entering test1
Creating a new instance of singleton
Method of the singleton class

$ ./test2
entering test2
Method of the singleton class

当前结果:

$./test1&
$ entering test1
Creating a new instance of singleton
Method of the singleton class

$ ./test2
entering test2
Creating a new instance of singleton
Method of the singleton class

编辑:由于我现在知道使用单例类的共享库无法完成我想做的事情,所以我现在计划使用共享内存方法。我遇到了一些有关使用共享内存(shmget)或mmap的好材料,请查看此链接http://beej.us/guide/bgipc/html/single/bgipc.html

0 个答案:

没有答案