gpt4 book ai didi

c++ - 具有原子状态的单例模式

转载 作者:行者123 更新时间:2023-11-30 05:04:59 27 4
gpt4 key购买 nike

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

最佳答案

我说得对吗,init_external_libraries() 最多只能运行一次?

原子在那里帮不了你。原子操作是原子操作(在您的情况下存储和加载值),但它们之间发生的事情不是。

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

它看起来像这样:

Object &get_singleton(){
static Object o;
return o;
}

编辑:据我所知,这是线程安全的。不过不要引用我的话。

关于c++ - 具有原子状态的单例模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48609339/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com