Дублированный синглтон при использовании разделяемой библиотеки - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь связать разделяемую библиотеку в Python, используя pybind11.

Я создал упрощенную версию, которая иллюстрирует проблему. Из python я вызываю функцию foobar . Эта функция вызывает статическую функцию, которая вызывает фабрику, которая снова вызывает фабрику, которая создает Singleton.

Это прекрасно работает, когда я запускаю код как исполняемый файл (без использования связывателя). Проблема в том, что когда библиотека используется со связывателем через Python, синглтон создается дважды (например, при каждом использовании синглтона). Однажды в конструкторе Factory2 и позже в функции foobar .

Я уже попробовал то, что предлагают другие решения, скрывая фабрики, но это не сработало, или я мог реализовать это неправильно.

Любые идеи о том, как это можно решить, поэтомучто синглтон создается только один раз? Любая помощь будет принята с благодарностью!

Я создал небольшой пример, иллюстрирующий проблему.

Main.cpp:

int foobar(){
Singleton::createModel();
Singleton::getModel(); //SECOND CALL TO CONSTRUCTOR

return 0;
}

Singleton.h:

class Singleton {
public:

static void createModel(){
    Factory factory;
}

static void setModel(Model *model) {
    Singleton::getInstance().model = model;
}


static Model *getModel() {
    return Singleton::getInstance().model;
}


private:
static Singleton &getInstance() {
    static Singleton instance;
    return instance;
}

Singleton() : model(nullptr) {};

~Singleton() {};

Model *model;
};

Factory.h:

class Factory {
public:
Factory(){
    Factory2 factory2;
 }
};

Factory2.h:

class Factory2 {
public:
Factory2();
};
...