2012-08-22 15 views
9

Powiel możliwe:
C++11 thread_local in gcc - alternatives
Is there any way to fully emulate thread_local using GCC's __thread?Jak zainicjować zmienną lokalną wątku w języku C++?

chciałem użyć C++ 11 thread_local tworzyć i używać zmiennej thread_local ale ponieważ nie jest jeszcze obsługiwany przez gcc, ja używam gcc specyficznego __thread. Sposób, w jaki ogłoszony zmienną jest

myClass 
{ 
public: 

    static __thread int64_t m_minInt; 

}; 
__thread int64_t myClass::m_minInt = 100; 

Kiedy go skompilować, pojawia się błąd jak

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

Jak prawidłowo zrobić?

PS: gcc version: 4.6.3

+6

@betabandido pytanie, które łączysz, omawia alternatywę dla wątku_ wątku w języku C++ 11. Moje pytanie brzmi: jak używać __thread z gcc. W szczególności omawiany komunikat o błędzie. Próbowałem znaleźć to gdzie indziej, ale nie mogłem tego dostać. Dzięki. – polapts

Odpowiedz

5

Trzeba użyć leniwe inicjowanie.

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 ma gwarantowane zero.

W większości przypadków (ELF specification) jest umieszczany w sekcji .tbss, która jest inicjowana od zera.

C++ - http://en.cppreference.com/w/cpp/language/initialization

Do innych nielokalnych zmiennych statycznych i nici lokalnego Zero inicjalizacja ma miejsce. W praktyce zmienne, które mają być inicjowane zerowo, są umieszczane w segmencie .bss obrazu programu , który nie zajmuje miejsca na dysku, i jest wyzerowywany przez system OS podczas ładowania programu.

+7

Skąd wiadomo, że m_minIntInitialized jest początkowo fałszywe? – CygnusX1

+2

@ CygnusX1, zaktualizowałem odpowiedź. – nothrow

+0

Masz warunek wyścigu: inny wątek może odczytać m_minInt po ustawieniu flagi na wartość true, ale przed zainicjalizowaniem zmiennej; – gdy

Powiązane problemy