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


Anmelden zum Antworten