c++ multithreading c++14

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