게임/자료구조&알고리즘

싱글톤

MAKGA 2021. 5. 10. 22:36
320x100
#include <mutex>
#include <memory>

template<class _Class>
class JISingleTon_CallOnce
{
public:
    static _Class& get_instance()
    {
        std::call_once(&flag_, [&ptr]() {
            ptr_ = std::make_unique<_Class>(); });

        return *instance;
    }

    JISingleTon_CallOnce = default;
    virtual ~JISingleTon_CallOnce() = default;
    JISingleTon_CallOnce(const JISingleTon_CallOnce&) = delete;
    JISingleTon_CallOnce& operator=(const JISingleTon_CallOnce&) = delete;
    JISingleTon_CallOnce(JISingleTon_CallOnce&&) = delete;
    JISingleTon_CallOnce& operator=(JISingleTon_CallOnce&&) = delete;

private:
    static std::unique_ptr<_Class> ptr_;
    static std::once_flag flag_;
};

 

보통 단순히 if - new로 할당 해 쓰거나 double check 방법들은 멀티스레딩에서 문제가 발생할 수 있다.

get_instance() 내에서 static 변수로 할당해 쓰거나(미사용시에도 메모리가 할당됨) std::call_once 함수를 통해 한번만 호출되도록 한다.

사용할 때는 위의 클래스를 상속 받아 사용한다.

class TClass : public JISingleTon_CallOnce<TClass>
{
// ...
};

TClass& a = TClass::get_instance();

 

320x100