gpt4 book ai didi

C++ 惰性单例挂起加载

转载 作者:行者123 更新时间:2023-11-30 03:43:44 24 4
gpt4 key购买 nike

我有惰性单例类,需要在第一次调用时使用 boost 进行序列化。

头文件:

class Singleton
{
public:

static Singleton& Instance()
{
static Singleton theSingleInstance;
return theSingleInstance;
}

void load();
private:
Singleton();
Singleton(const Singleton& root);
Singleton& operator=(const Singleton&);
std::map<std::string,std::string > m_desc;

friend class boost::serialization::access;
template<typename Archive>
void serialize(Archive& arc, const unsigned int version)
{
arc & BOOST_SERIALIZATION_NVP(m_desc);
}
const char* FILENAME = "./config.xml";
};

源文件

#include "singleton.h"
Singleton::Singleton()
{
load();
}


void Singleton::load()
{
try
{
std::ifstream f(FILENAME);
boost::archive::xml_iarchive arc(f);
arc & boost::serialization::make_nvp("Config",Instance());
}
catch(...)
{
std::cout << "Exception" << std::endl;
}
}

所以当我尝试使用这个单例启动我的代码时,它挂起了。通过调试器,我可以看到它不会多次进入 load() 方法(没关系)。当我暂停调试器时,它会在 return theSingleInstance; 行停止,但它也不会多次通过该行上的断点。我做错了什么?

最佳答案

您从构造函数内部调用加载。这意味着当您...调用 Instance 时,您在静态 theSingleInstance 的构造函数中:

  #0   in Singleton::load at test.cpp <test.cpp>
#1 in Singleton::Singleton at test.cpp <test.cpp>
#2 in Singleton::Instance at test.cpp <test.cpp>
#3 in main at test.cpp <test.cpp>

由于构造 c++11 函数局部静态保证是线程安全的,这意味着 - 在您的实现中 - 执行将阻塞直到实例完全构造(或构造失败,因此可以重试)。

当然,这永远不会发生,因为 build 正在等待自己。

   0x00000000004030f5 <+629>:   callq  0x402be0 <__cxa_guard_acquire@plt>
=> 0x00000000004030fa <+634>: test %eax,%eax
0x00000000004030fc <+636>: je 0x402ff1 <Singleton::load()+369>

当然,这可以通过在构建实例的同时使用外部访问器来解决,正如您已经发现的那样。

关于C++ 惰性单例挂起加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35941017/

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