안녕하세요 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);
}