clang thread_local初始化中的错误

Cur*_*ous 8 c++ multithreading clang thread-local c++17

以下代码应该只创建thread_local一次in-class ,但最终会在每次访问时初始化它

#include <iostream>
#include <thread>

using std::cout;
using std::endl;

template <typename T>
class Something {
public:
    struct TLBookkeeping {
        TLBookkeeping() {
            std::cout << "TLBookkeeping() " << std::this_thread::get_id() << std::endl;
        }
    };

    static void foo();
    static thread_local TLBookkeeping bookkeeping_;
};

template <typename T>
thread_local typename Something<T>::TLBookkeeping Something<T>::bookkeeping_;

template <typename T>
void Something<T>::foo() {
    std::cout << &bookkeeping_ << std::endl;
    std::cout << &bookkeeping_ << std::endl;
}

namespace {
struct Struct {};
}

int main() {    
    Something<Struct>::foo();
}
Run Code Online (Sandbox Code Playgroud)

(https://wandbox.org/permlink/fgqCDHV0axKDRt89)

有趣的Struct是,该错误仅显示何时在匿名命名空间中.

有人知道这是否是一个铿锵的bug(gcc做对了 - https://wandbox.org/permlink/hsxRj8OdYbt4Eeck)或者本来就是错误的使用thread_local?如果是后者,那么正确的用法是什么?如果是前者,那究竟是什么bug?这是在某处记录的吗?我们应该打开错误报告吗?

ein*_*ica 1

当您发现编译器导致您相对确定不正确的运行时行为时;另一个流行的编译器不会导致相同的行为 - 恕我直言,这足以针对所述编译器提交错误。

根据 @SamVarshavchik 的建议,您:

  1. 访问LLVM 的错误跟踪器
  2. 如果您没有帐户,请创建一个帐户
  3. 查找重复项(例如使用术语“线程本地”)
  4. 如果你没有找到 - 你就提交了一个错误

我已经这样做了,所以现在我们有bug 42111

最坏的情况是——它会被标记为骗局。

编辑:这不是一个骗局,刚刚(2019 年 6 月 5 日)已修复。