와우, 나는 가장 명백한 대답을 언급 한 사람을 믿을 수 없으며 C #의 정적 생성자 동작을 가장 가깝게 모방 한 사람, 즉 해당 유형의 첫 번째 객체가 생성 될 때까지 호출되지 않습니다.
std::call_once()
C ++ 11에서 사용 가능합니다. 그것을 사용할 수 없다면 정적 부울 클래스 변수와 비교 및 교환 원자 연산으로 수행 할 수 있습니다. 생성자에서 클래스 정적 플래그를에서 false
로 변경할 수 true
있는지 확인하고, 그렇다면 정적 생성 코드를 실행할 수 있습니다.
추가 크레딧을 얻으려면 부울 대신 3 방향 플래그로 설정하십시오 (예 : 달리기, 달리기 및 실행 완료). 그런 다음 정적 생성자를 실행하는 인스턴스가 완료 될 때까지 해당 클래스의 다른 모든 인스턴스를 스핀 잠금 할 수 있습니다 (예 : 메모리 울타리를 실행 한 후 상태를 "실행 완료"로 설정). 스핀 락은 프로세서의 "일시 정지"명령을 실행하고 임계 값 등이 올 때마다 대기 시간을 두 배로 늘려야합니다. 표준 스핀 락킹 기술입니다.
C ++ 11 이 없는 경우 시작해야합니다.
여기 당신을 안내하는 의사 코드가 있습니다. 이것을 클래스 정의에 넣으십시오.
enum EStaticConstructor { kNotRun, kRunning, kDone };
static volatile EStaticConstructor sm_eClass = kNotRun;
그리고 이것은 당신의 생성자에서 :
while (sm_eClass == kNotRun)
{
if (atomic_compare_exchange_weak(&sm_eClass, kNotRun, kRunning))
{
/* Perform static initialization here. */
atomic_thread_fence(memory_order_release);
sm_eClass = kDone;
}
}
while (sm_eClass != kDone)
atomic_pause();