2016-07-10 8 views
-1

Ich entschuldige mich hiermit für solch einen allgemeinen Titel.
Ich schreibe eine physikalische Simulation-Anwendung, die Daten in 3D mit OpenGL anzeigt, und eine der Funktionen, die für einige schwere Berechnungen verantwortlich ist, scheint die Leistung ein wenig zu halten. Ich möchte, dass sie "im Hintergrund" gemacht werden, ohne die Anwendung für ein paar Sekunden einzufrieren. Allerdings scheint std :: thread in meinem Fall nicht zu funktionieren.
Die Funktion, die ich versuche zu fädeln, enthält viele Berechnungen, sie weist hier und da etwas Speicher auf, ruft andere Funktionen auf und verwendet Klassen, wenn das wichtig ist. Ich habe eine Wrapper-Funktion erstellt, von dem ich versuche, einen Thread zu starten:Amateur kann std nicht verstehen :: Thread-Verwendung

void WrapperFunction(void) 
{ 
std::thread t(DoSomethingSerious); 
t.join(); 
} 

Es scheint jedoch, dass es Null-Effekt hat, wie gerade, wenn es DoSomethingSerious direkt aufgerufen. Was könnte das Problem sein?

+1

Vielleicht 'lesen Sie auf' std :: thread :: join(). – juanchopanza

+0

't.join();' wartet darauf, dass der Thread beendet wird, bevor es zur nächsten Zeile weitergeht. –

Antwort

1

join() wartet auf den Thread zu beenden, bevor Sie fortfahren. Das bedeutet, einem Thread beizutreten.

Sie haben zwei Möglichkeiten.

1) Instantiieren Sie eine std::thread, und machen Sie weiter, was immer noch getan werden muss, und treten Sie nur dem Thread bei, sobald alles fertig ist.

2) detach() der Thread. Der gelöschte Thread wird weiterhin unabhängig ausgeführt und kann nicht mehr verknüpft werden. In diesem Fall müssen Sie andere Vorkehrungen treffen, bis der Thread stoppt.

+0

Oh, dumm mich. Das ist richtig. Ich hätte es nur ein bisschen schwieriger googeln sollen. Ich werde Ihre Antwort annehmen, sobald 9 Minuten verstrichen sind. –

1

Das ist, weil Sie direkt t.join() anrufen. Die std::thread::join Funktion wartet für den Thread zu beenden, bevor Sie zurückkehren. Wie Sie selbst bemerken, besteht der Effekt darin, dass es keinen Unterschied zum Aufruf der Funktion gibt.

Nützlicher wäre es, etwas anderes zwischen der Thread-Erstellung und dem Warten auf den Thread zu tun. So etwas wie die folgenden Pseudo-Code:

void WrapperFunction(void) 
{ 
    // Create thread 
    std::thread t(DoSomethingSerious); 

    // Lots 
    // of 
    // code 
    // doing 
    // other 
    // things 

    // Wait for thread to finish 
    t.join(); 
} 
1

Es scheint jedoch, dass es Null auswirkt.

Sicher, Ihr Code im Haupt-Thread ist nur ausgesetzt, bis alles im asynchronen Thread fertig ist.

Wenn Sie Zwischen Aktionen haben zwischen den Thread starten und die join() tun, sollten Sie die Wirkung bemerken:

void WrapperFunction(void) { 
    std::thread t(DoSomethingSerious); 
    // Do something else in parallel 
    t.join(); 
}