c++11
以降にスレッドセーフなシングルトンパターンを実装する方法を学習しています。std :: systemシングルトンオブジェクトをインスタンス化する際の例外
#include <iostream>
#include <memory>
#include <mutex>
class Singleton
{
public:
static Singleton& get_instance();
void print();
private:
static std::unique_ptr<Singleton> m_instance;
static std::once_flag m_onceFlag;
Singleton(){};
Singleton(const Singleton& src);
Singleton& operator=(const Singleton& rhs);
};
std::unique_ptr<Singleton> Singleton::m_instance = nullptr;
std::once_flag Singleton::m_onceFlag;
Singleton& Singleton::get_instance(){
std::call_once(m_onceFlag, [](){m_instance.reset(new Singleton());});
return *m_instance.get();
};
void Singleton::print(){
std::cout << "Something" << std::endl;
}
int main(int argc, char const *argv[])
{
Singleton::get_instance().print();
return 0;
}
コードは正常にコンパイルされますが、実行すると次の例外が発生します。
terminate called after throwing an instance of 'std::system_error'
what(): Unknown error -1
Aborted
私はgdb
でプログラムをデバッグしようとしました。 std::call_once
を呼び出すと例外がスローされたようです。何が起こっているのか分かりませんが、ラムダ式がオブジェクトを作成できなかったと仮定します。
2番目の質問です。未知のエラーコードが実際に意味するものを知る方法はありますか?私は-1
は、問題を特定しようとするとあまり役に立たないと思います。
ありがとうございました。
マイヤーズのシングルトンを使わないのはなぜですか? – Jarod42
Jarodにスレッドの安全性について何かお答えする場合は、[this](https://stackoverflow.com/questions/1661529/is-meyers-implementation-of-singleton-pattern-thread-safe)を参照してください – StoryTeller
@ Jarod42私はMeyerのシングルトンについて知っていただけです。多くの読書が先行しています:) – hannibal