Scoped Static

C++11부터 등장한 것으로
함수의 Scope 내부에 static 속성으로 선언 되는 객체는
프로세스의 시작 ~ 종료 과정 동안 오직 한번만 초기화되므로(이때 Lazy Initialization 방식을 취함)
std::mutex나 std::call_once같은 것으로 배타적 접근을 구현할 필요가 전혀 없다.

또한 오직 하나만 존재하는 것을 보장하기 때문에
멀티 쓰레드 환경에서 호출되었다 하더라도 무조건 한번만 초기화 된다.

아래의 코드를 실행해 보면 어떻게 동작하는지 알 수 있다.

class ScopedStatic
{
public:
	ScopedStatic(int _num)
	{
		std::cout << "ScopedStatic( "<<_num<<" )" << std::endl;
		num = _num;
	}

	int num;
};

void InitOnlyOnce(int _num)
{	// Scoped Static은 프로세스의 시작~종료 동안 오직 한번만 초기화 되며, 단 하나임을 보장한다.
	// 또한 Lazy Initialization 방식으로 동작한다.(즉, InitOnlyOnce 함수가 호출되었을 때 초기화 된다)
    // 때문에 ScopedStatic이 한번 초기화 된 후일지라도 Scoped Static코드를 지날 때 약간의 오버로드가 존재할 수 있음
	static ScopedStatic ss(_num);
}

int main()
{
	std::cout << "program starts" << std::endl;
	std::thread t1(InitOnlyOnce,3);
	std::thread t2(InitOnlyOnce,2);

	t1.join();
	t2.join();
}

 

Scoped static을 이용하면 Singleton 패턴을 간단하게 구현할 수 있다.

class Singleton
{
public:
	static Singleton& GetInstance()
    {
    	static Singleton obj; // scoped static이기 때문에 유일 객체임을 보장
        return obj;
	}
private:
	Singleton() = defautl;
    // 완전한 싱글턴 패턴을 구현하기 위해 Copy/Move Constructor &  Assignment를 삭제
    Singleton( const Singleton & ) = delete;
    Singleton( Singleton && ) = delete;
    Singleton& operator=( const Singleton& ) = delete;
    Singleton& operator=( Singleton && ) = delete;
}

 

 

참고로 C++에서는 Singleton을 구현할 수 있는 방법이 여러가지이다.

 
 
 

'C++ > C++' 카테고리의 다른 글

Variadic Template 가변인자 템플릿의 Recursive call 문법  (0) 2022.03.11
멤버 함수 포인터(Member Function Pointer)  (0) 2022.02.11
MSVC++ Tips  (0) 2022.01.22
MSVC 컴파일러 전용 XML 주석  (0) 2022.01.12
문자열 쪼개기 Split  (0) 2021.12.31
Posted by Elan
: