c++ - Definición de la plantilla miembro estática thread_local: la inicialización falla con gcc
multithreading c++14 (1)
Cuando un miembro estático en una clase de C ++ es thread_local
y una plantilla de miembro, no se inicializa.
#include <unordered_map>
#include <iostream>
class A {
public:
template<typename T>
thread_local static std::unordered_map<int,T> m;
};
template<typename T>
thread_local std::unordered_map<int,T> A::m{};
int main() {
// A::m<int> = std::unordered_map<int,int>{}; // solves the problem
std::cout << A::m<int>.bucket_count() << std::endl; // returns zero.
A::m<int>.insert({1,2}); // causes SIGPFE (hash modulo bucket_count)
}
Unordered_map no se inicializa y tiene un conteo de cero. Esto conduce a una división cero cuando el hash se toma en módulo y el conteo de cubetas. Sin el thread_local
o sin la template
funciona bien. La inicialización manual del miembro en cada subproceso que lo usa (línea comentada) resuelve el problema.
¿Es este comportamiento indefinido según el estándar de C ++ o podría ser un error del compilador? Lo intenté con gcc 7.1.1 y con 5.2.0 que producen el error. clang 3.8 parece funcionar.
Edición: confirmé este comportamiento con gcc 8.0.0 20170817 de SVN y presenté un informe de error: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880
Una vez más, para cerrar la pregunta: presenté un informe de error, consulte https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81880