2012-08-22 4 views
9

가능한 중복은 :
C++11 thread_local in gcc - alternatives
Is there any way to fully emulate thread_local using GCC's __thread?C++에서 스레드 로컬 변수를 초기화하는 방법은 무엇입니까?

내가 만들고 thread_local 변수를 사용하여 C++ (11) thread_local를 사용하고 싶어하지만 아직 GCC를 지원하지 않습니다, 나는 gcc 특정 __thread을 사용하고 있습니다. 나는 변수를 선언하는 방법은 내가 그것을 컴파일하면, 내가 제대로 작업을 수행하는 방법에

error: ‘myClass::minInt’ is thread-local and so cannot be dynamically initialized 

같은 오류가

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 

}; 
__thread int64_t myClass::m_minInt = 100; 

입니까?

추신 : gcc 버전 : 4.6.3

+6

는 링크 된 질문 11 C++로 thread_local 할 수있는 대안을 설명 @betabandido. 제 질문은 gcc에서 __thread를 사용하는 방법입니다. 특히 문제의 오류 메시지입니다. 나는 그것을 다른 곳에서 찾으려고했지만 그것을 얻을 수 없었다. 감사. – polapts

답변

5

지연 초기화를 사용해야합니다.

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 
    static __thread bool m_minIntInitialized; 

    static int64_t getMinInt(); 
}; 
__thread int64_t myClass::m_minInt; 
__thread bool myClass::m_minIntInitialized; 


int64_t myClass::getMinInt() 
{ 
    if (!m_minIntInitialized) // note - this is (due to __thread) threadsafe 
    { 
    m_minIntInitialized = true; 
    m_minInt = 100; 
    } 

    return m_minInt; 
} 

m_minIntInitialized

는 제로로 보장됩니다. 이 0으로 초기화되는 부분을 배치하는 .tbss 대부분의 경우

(ELF specification). C++ 용

- 모든 다른 비 - 로컬 정적 스레드 로컬 변수의 http://en.cppreference.com/w/cpp/language/initialization

제로 초기화가 이루어진다. 실제로 가고있다 변수에는 디스크 공간을 차지하지 않는 프로그램 화상의 .bss라고 세그먼트에 배치 제로 - 초기화 프로그램을로드 할 때 OS 의하여 제로 아웃 될 수있다.

+7

m_minIntInitialized가 초기에 거짓인지 어떻게 알 수 있습니까? – CygnusX1

+2

@ CygnusX1, 답변을 업데이트했습니다. – nothrow

+0

경쟁 조건이 있습니다. 플래그가 참으로 설정되고 변수가 초기화되기 전에 다른 스레드가 m_minInt를 읽을 수 있습니다. – gdy