Programing

함수 정적 변수는 GCC에서 스레드로부터 안전합니까?

lottogame 2020. 12. 13. 08:31
반응형

함수 정적 변수는 GCC에서 스레드로부터 안전합니까?


예제 코드에서

void foo()
{
  static Bar b;
  ...
}

GCC컴파일 b하면 스레드로부터 안전한 방식으로 생성되고 초기화됩니다.

gcc의 man 페이지에서 -fno-threadsafe-statics 명령 줄 옵션을 찾았습니다 .

로컬 정적의 스레드로부터 안전한 초기화를 위해 C ++ ABI에 지정된 루틴을 사용하기 위해 추가 코드를 생성하지 마십시오. 이 옵션을 사용하여 스레드로부터 안전 할 필요가없는 코드에서 코드 크기를 약간 줄일 수 있습니다.

  1. 그것은 로컬 정적이 GCC에서 기본적으로 스레드로부터 안전하다는 것을 의미합니까? 그래서 명시적인 보호를 할 이유가 없습니다 pthread_mutex_lock/unlock.

  2. 이식 가능한 코드를 작성하는 방법-컴파일러가 가드를 추가하는지 확인하는 방법은 무엇입니까? 아니면 GCC의이 기능을 끄는 것이 더 낫습니까?


  1. 아니요, 이는 로컬 초기화static 가 스레드로부터 안전함을 의미합니다.

  2. 이 기능을 활성화 된 상태로 두어야합니다. 스레드로부터 안전한 로컬 초기화 static는 매우 중요합니다. 일반적으로 로컬에 대한 스레드로부터 안전한 액세스 static가 필요하면 적절한 가드를 직접 추가해야합니다.


로컬 정적 초기화를 보호하기 위해 GCC 3.4에서 생성 된 잠금 코드에 심각한 문제가있었습니다. 이 버전은 전역 공유 뮤텍스사용하여 코드에서 교착 상태로 이어지는 모든 정적 초기화를 보호했습니다. 우리는 지역 정적 변수를 생성 한 또 다른 스레드를 시작한 함수의 결과에서 초기화 된 지역 정적 변수를 가졌습니다. 의사 코드 :

voif f()
{
  static int someValue = complexFunction();
  ...
}
int complexFunction()
{
  start_thread( threadFunc() );
  wait_for_some_input_from_new_thread();
  return input_from_new_thread;
}
void threadFunc()
{
  static SomeClass s();
  ...
}

유일한 해결책은 gcc의이 기능을 비활성화하는 것입니다. 우리가 한 것처럼 코드를 이식 가능해야한다면 스레드 안전성을 위해 특정 gcc 버전에 추가 된 기능에 의존 할 수 없습니다. 아마도 C ++ 0x는 스레드로부터 안전한 로컬 정적을 추가합니다. 그때까지는 이것이 비표준 마법이어서 코드를 이식 할 수 없게 만드는 것이므로 이에 대해 조언합니다. 사용하기로 결정한 경우 샘플 애플리케이션을 작성하여 gcc 버전이 이러한 목적으로 단일 전역 뮤텍스를 사용하지 않는지 확인하는 것이 좋습니다. (쓰레드 안전성의 어려움은 gcc조차도 제대로 할 수 없다는 사실에서 분명합니다)


이것은 실제로 귀하의 질문에 대한 답변이 아닙니다 ( Charles는 이미 그렇게했습니다 ) . 이 기사에 대한 링크를 다시 게시 할 때라고 생각 합니다. 그것은 전역의 초기화에 빛을 던지며 static다중 스레드 환경에서 변수 를 사용하려는 모든 사람이 읽고 이해해야 합니다.


핵심 문구는

... 스레드로부터 안전한 로컬 정적 초기화 .

이것은 스레드로부터 안전한 방식으로 수행되는 정적 초기화 일 뿐이라는 의미로 읽었습니다. 정적의 일반적인 사용은 스레드로부터 안전하지 않습니다.

참고 URL : https://stackoverflow.com/questions/1270927/are-function-static-variables-thread-safe-in-gcc

반응형