싱글 톤을 사용하는 프로그램이 있습니다. 이 프로그램은 런타임에 공유 객체 라이브러리를로드합니다. 이 라이브러리는 또한 동일한 싱글 톤을 사용합니다. 문제는 라이브러리에서 싱글 톤에 액세스 할 때 싱글 톤의 새 인스턴스가 만들어집니다.런타임 동적로드 및 싱글 톤
이 프로그램은 -rdynamic
와 연결되어, 나는 모두 -fPIC
를 사용하고 하중은 다음과 같이 발생합니다 도서관이 같은 수준의 수출
std::shared_ptr<Module> createModuleObject(const std::string& filename)
{
if (!fs::exists(filename))
throw std::runtime_error("Library not found: " + std::string(filename));
struct export_vtable* imports;
void *handle = dlopen(filename.c_str(), RTLD_LAZY | RTLD_GLOBAL);
if (handle) {
imports = static_cast<export_vtable*>(dlsym(handle, "exports"));
if (imports)
return std::shared_ptr<Module>(imports->make());
else
throw std::runtime_error("Error trying to find exported function in library!");
} else
throw std::runtime_error("Error trying to load library: " + std::string(filename));
}
:
Module* make_instance()
{
return new HelloWorld();
}
struct export_vtable
{
Module* (*make)(void);
};
struct export_vtable exports = { make_instance };
를 그 클래스를 사용합니다 싱글 톤의
이는 싱글 톤 (Configuration.cpp
)를 만드는 방법이다 :
std::unique_ptr<Configuration> Configuration::instance_(nullptr);
std::once_flag Configuration::onlyOnceFlag_;
Configuration& Configuration::instance()
{
if (instance_ == nullptr)
{
std::cout << "INSTANCE IS NULL, CREATING NEW ONE" << std::endl;
std::call_once(Configuration::onlyOnceFlag_,
[] {
Configuration::instance_.reset(new Configuration());
});
}
return *Configuration::instance_;
}
프로그램과 Configuration.cpp
에 대한 라이브러리 링크 모두. 라이브러리에서이를 생략하면 싱글 톤에 액세스하려고 할 때 정의되지 않은 심볼 오류가 발생합니다.
누구든지이 문제를 해결하는 방법을 알고 있습니까? 고마워요!
입니다. 동적으로 링크 된 라이브러리에서는 의도 한대로 작동하지 않습니다. 또한 [Scott Meyer의 싱글 톤 패턴] (https://stackoverflow.com/questions/1008019/c-singleton-design-pattern)을 고수하십시오. – user0042
싱글 톤에는 아무런 문제가 없습니다. 이 특정 구현에는 두 가지 문제가 있습니다. 1) 싱글 톤 수명을 제어하지 않았습니다. 인스턴스 메서드를 얻는 첫 번째 호출에서 싱글 톤을 만드는 것은 결코 좋은 생각이 아닙니다. 2) 라이브러리는 부모 응용 프로그램에서 생성 한 싱글 톤을 요청하는 대신 자체 싱글 톤을 만듭니다. 이'instance()'메소드를 수정하려면 메인 애플리케이션에서 가져와야합니다. 추신 Scott Meyer의 Singleton Pattern은 Antipattern이라고해야합니다. – VTT
라이브러리 내에서 동일한 싱글 톤을 재사용 할 수 있어야합니다. 그렇죠? 문제는 다른 하나를 가리키는 라이브러리 내부의 싱글 톤 인 것 같습니다. 'setConfiguration()'메소드 나 라이브러리에있는 것이 나를위한 옵션이 아닙니다. 왜냐하면 그 목적을 다소 떨어 뜨리기 때문입니다. ** 편집 : ** "기본 응용 프로그램에서 가져온"은 무엇을 의미합니까? – Pfaeff