单态模式与原子状态

时间:2018-02-04 14:50:22

标签: c++ thread-safety singleton atomic c++17

通过使用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;
}

1 个答案:

答案 0 :(得分:1)

我是否正确,init_external_libraries()最多只能运行一次?

Atomics不会帮助你。原子的操作是原子的(在你的情况下存储和加载值),但是那些之间发生的事情不是。

您可以使用具有静态对象的函数并返回对它的引用的好技巧。据我所知,静态值的初始化只保证发生一次。

它看起来像这样:

Object &get_singleton(){
    static Object o;
    return o;
}
编辑:据我所知,这是线程安全的。不过不要引用我的话。