2014-10-24 2 views
3

안녕하세요 gcc 4.8.1을 사용하여 다음을 실행할 때 thread_local 키워드를 사용하면 어설 션이 발생합니다. thread_local을 제거하면 assert가 히트되지 않습니다. 아무도 이것이 왜 있는지 압니까? 정의되지 않은 전역 정렬이 있지만 ptr_를 할당하기 전에 buf_에 유효한 주소가 있어야합니다. 키워드 인 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); 
} 

답변