2014-10-24 4 views
3

Привет при запуске следующего использования gcc 4.8.1 при использовании ключевого слова thread_local это утверждение ударяется. При удалении thread_local утверждение не ударяется. Кто-нибудь знает, почему это? Существует некоторый неопределенный глобальный порядок, но я ожидаю, что buf_ будет иметь действительный адрес перед назначением ptr_. Просто удалите ключевое слово thread_local, и оно работает для меня.C++ 11 Глобальный порядок инициализации и thread_local

Выход:

$ ./ThreadLocal 
Running Tester 
ThreadLocal: main.cpp:13: int main(): Assertion `buf == ptr' failed. 
Aborted (core dumped) 

Output when removing thread_local keyword 
Running Tester 

Test.hpp

#include <iostream> 
#include <cassert> 

template <typename std::size_t N> 
struct Mem 
{ 
    Mem() noexcept: ptr_(buf_) 
    {} 

    char * getBuf() { return buf_; } 
    char * getPtr() { return ptr_; } 

private: 
    char buf_[N]; 
    char * ptr_; 
}; 



template <typename std::size_t N> 
struct Tester 
{ 
    Tester() 
    { 
     std::cout << " Running Tester " << std::endl; 
    } 

    char * getPtr() { return _mem.getPtr(); } 
    char * getBuf() { return _mem.getBuf(); } 

private: 
    static thread_local Mem<N> _mem; 
}; 

main.cpp

#include <iostream> 
#include "Test.hpp" 

template <typename std::size_t N> 
thread_local Mem<N> Tester<N>::_mem; 

int main() 
{ 
    Tester<500> t; 
    char * ptr = t.getPtr(); 
    char * buf = t.getBuf(); 

    assert(buf == ptr); 
} 

ответ