wake-up-neo.net

Übergeben Sie mehrere Argumente an std :: thread

Ich frage nach der <thread>-Bibliothek im C++ 11-Standard. 

Angenommen, Sie haben eine Funktion wie: 

void func1(int a, int b, ObjA c, ObjB d){
    //blahblah implementation
}

int main(int argc, char* argv[]){
    std::thread(func1, /*what do do here??*/);
}

Wie übergeben Sie all diese Argumente in den Thread? Ich habe versucht, die Argumente wie folgt aufzuführen: 

std::thread(func1, a,b,c,d);

Es beklagt sich jedoch, dass es keinen solchen Konstruktor gibt. Um dies zu umgehen, können Sie eine Struktur definieren, um die Argumente zu packen. Aber gibt es eine andere Möglichkeit, dies zu tun? 

37
turtlesoup

Sie übergeben sie buchstäblich in std::thread(func1,a,b,c,d);, das hätte kompiliert werden müssen, wenn die Objekte vorhanden waren, aber aus einem anderen Grund ist es falsch. Da kein Objekt erstellt wurde, können Sie den Thread nicht verbinden oder trennen, und das Programm funktioniert nicht ordnungsgemäß. Da es sich um einen temporären Destruktor handelt, wird der Destruktor sofort aufgerufen, da der Thread noch nicht verbunden oder getrennt wurde, wird std::terminate aufgerufen. Sie könnten std::join oder std::detach vor der Zerstörung der Temperatur wie std::thread(func1,a,b,c,d).join();//or detach

So sollte es gemacht werden. 

std::thread t(func1,a,b,c,d);
t.join();  

Sie können den Thread auch lösen und sich über Threads informieren, wenn Sie den Unterschied zwischen dem Verbinden und dem Trennen nicht kennen.

47
aaronman

Wenn Sie dies erhalten, haben Sie möglicherweise vergessen, #include <thread> an den Anfang Ihrer Datei zu setzen. Die Signatur von OP scheint zu funktionieren. 

0
pixelpax