본문 바로가기
Tools for Dev

쓰레드에 안전한 초기화용 boost library

by leanu 2010. 3. 19.
프로그램을 짜다 보면 딱 한번만 실행해야 하는 함수들이 있을수 있다.

그런경우 아래와 같이 static bool 변수같은걸 두고 그 값에 따라서 수행하기도 하는데



이 함수가 multi thread 접근을 하는경우 초기화가 다중으로 될 수 있는 위험이 있다.

다행히 boost에서 thread 에 안전한 함수를 제공한다. 

  • boost::call_once() 는 연결된 함수포인터를보고 단 한번만 수행한다. 두번째로 받는 파라미터는 boost::once_flag 형이다. thread safe 하다.

  • boost::once_flag 는 매크로 BOOST_ONCE_INIT 으로 초기화 한다. 초기화 역시 thread safe 하다.

플래그를 전역변수가 아닌 함수 내부 static 변수로 둘경우 아래와 같이 구성할수 있다.


주의해야 할 점은 이 함수들을 클래스의 멤버함수로 구현하는 경우, 초기화의 실제 동작 부분인 initOnlyOnceCore() 는 private 으로 가려져야 이 함수가 직접 호출되는 것을 막을 수 있다.

댓글