通过使用2个静态原子和互斥变量来保存2个状态是一个正确的方法来制作单例对象:初始化和初始化?
例如,我只需要在程序中运行一个Application
实例。它的工作是初始化和终止外部库,并阻止创建任何新的Application
对象。
#include <mutex>
#include <stdexcept>
static bool initialized;
static std::mutex mutex;
Application::Application()
{
std::lock_guard<std::mutex> lock(mutex);
if (initialized) throw std::runtime_error("Application::Application");
if (!init_external_libraries())
throw std::runtime_error("Application::Application");
initialized = true;
}
Application::~Application()
{
terminiate_external_libraries();
initialized = false;
}
答案 0 :(得分:1)
我是否正确,init_external_libraries()最多只能运行一次?
Atomics不会帮助你。原子的操作是原子的(在你的情况下存储和加载值),但是那些之间发生的事情不是。
您可以使用具有静态对象的函数并返回对它的引用的好技巧。据我所知,静态值的初始化只保证发生一次。
它看起来像这样:
Object &get_singleton(){
static Object o;
return o;
}
编辑:据我所知,这是线程安全的。不过不要引用我的话。