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
'게임 > 자료구조&알고리즘' 카테고리의 다른 글
[작성중] 문자열 검색 (0) | 2023.05.28 |
---|---|
정렬 - 추가중 (0) | 2021.07.30 |
[알고리즘] 허프만 트리를 이용한 텍스트 압축 (0) | 2021.07.02 |