Ошибка в инициализации clang thread_local - PullRequest
0 голосов
/ 24 сентября 2018

Следующий код должен создавать класс thread_local только один раз, но в конечном итоге его инициализируют при каждом доступе

#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();
}

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

Интересно, ошибкапоказывает только, когда Struct находится в анонимном пространстве имен.

Кто-нибудь знает, является ли это ошибкой лягушки (gcc исправляет ошибку - https://wandbox.org/permlink/hsxRj8OdYbt4Eeck) или некорректно использует thread_local?последнее, как правильно использовать? Если первое, что именно ошибка? И это где-то задокументировано? Должны ли мы открыть отчет об ошибке?

1 Ответ

0 голосов
/ 03 июня 2019

Когда вы обнаружите, что компилятор вызывает поведение во время выполнения, которое вы относительно уверены, неверно;и другой популярный компилятор не вызывает такое же поведение - этого достаточно, ИМХО, чтобы сообщить об ошибке в указанном компиляторе.

Как подсказывает @SamVarshavchik, вы:

  1. Посетите Система отслеживания ошибок LLVM
  2. Создайте учетную запись, если у вас ее нет
  3. Найдите дубликаты (например, используйте термин "локальный поток")
  4. Если вы не нашли его - вы подаете ошибку

Я только что это сделал, так что теперь у нас есть ошибка 42111 .

В худшем случае- он будет помечен как дублирование.

edit: Это не было дублирование, и только сейчас (5 июня 2019 г.) это исправлено.

...