繁体   English   中英

c ++ 11全局初始化顺序和thread_local

[英]c++11 Global initialization order and thread_local

嗨,当使用gcc 4.8.1运行以下内容时,使用thread_local关键字时会断言断言。 删除thread_local时,不会触发断言。 有人知道为什么吗? 有一些未定义的全局排序,但我希望buf_在分配ptr_之前有一个有效的地址。 只需删除关键字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 );
}

它看起来像是GCC中的一个错误。 显然, Tester::_mem根本没有被初始化。 GCC 4.9.0也是这样 ,但是clang 3.5.0工作正常

使_mem不依赖于模板参数会导致GCC崩溃

最后,使Tester成为非模板类使得GCC终于工作了

更新:这些似乎是GCC中的已知 错误

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM