thread_local laufzeitfehler unter Windows
-
Hallo,
ich habe ein Problem mit einer thread_local Variable.
Hier mal ein Minimalbeispiel, das zeigen soll was ich vorhabe:#ifndef TEST_H_ #define TEST_H_ class Test{ private: vector<bool> test_vector; public: void foo(); void startThread(); }; #endif /* TEST_H_ */#include <iostream> //#include <unistd.h> #include <thread> #include "Test.h" using namespace std; void Test::startThread(){ thread t1(&Test::foo, this); thread t2(&Test::foo, this); t1.join(); t2.join(); } void Test::foo(){ thread_local vector<bool> test_vector = this->test_vector; cout << "Hallo " << endl; for(auto item:test_vector){ cout << item; } } int main() { test_vector = {1,0,1}; Test t; t.startThread(); return 0; }Es geht darum Threads parallel zu starten, bei dem aber jeder Thread mehrere lokale Variablen braucht.
Also speichere ich die Vektoren und Objekte mittels thread_local in lokalen Variablen ab.
Unter Linux läuft das super so, allerdings stürzt mein Programm unter Windows, wenn eine thread_local Variable im Thread vorkommt, beim verlassen des Threads / beim Erreichen des joins() ab.
MinGW ist alles die aktuellste x64-Bit version. C++11 ist gesetzt.MfG
Targunitoth
-
AFAIK ist bei MinGW thread_local leider immer noch einfach ein Art #define für __thread.
__thread ist eine GCC Extension, die thread local storage (tls) für triviale Typen bietet.
Trivial deswegen, weil es ziemlichen Murks mit Typen mit Destruktoren gibt.
-> Du kannst std::vector nicht thread_local machen.
Die einzige Lösung ist einen Pointer thread_local zu machen und manuell den am Anfang des Threads mit new zu setzen und am Ende zu löschen.
-
Danke für die schnelle Antwort, dann weiß ich Bescheid