我正在一个涉及创建单例类的项目中。因此,我为单例类创建了一个共享库,并创建了两个使用该类的二进制文件。当第一个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。