Я работаю над проектом, который включает создание одноэлементного класса. Поэтому я создал общую библиотеку для одноэлементного класса и создал два двоичных файла для использования этого класса.Когда первый exe вызывает статическую функцию класса "getInstance ()", создается новый экземпляр Singleton, и это ожидается, но когда я вызываю getInstance () из второго exe, новый экземпляр 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.