2015-08-21 5 views
8

Während C++ 11 über Multithreading in Lesen, bemerkte ich, dass einige Tutorials dies zu tun:Ist es sicher, nicht konstante Elementfunktionen für rvalue-Objekte aufzurufen?

std::thread(print_message, "Hello").detach(); 

// instead of... 

std::thread t(print_message, "Hello"); 
t.detach(); 

Meine Fragen sind:

  1. Im Allgemeinen ist es sicher nicht konstante Elementfunktionen aufrufen für temporäre (rvalue) Objekte?
  2. Insbesondere ist es sicher, dies für eine C++ 11 std::thread zu tun?
+1

Für Punkt 1: Es ist sicher, Memberfunktionen aufzurufen, die keine Vorbedingung haben (für Klassentypen usw. in Namespace std). –

Antwort

10
  1. Ja: die nicht konstante Funktion ausgeführt wird, während das Objekt noch am Leben ist, so gibt es kein Problem.
  2. Ja: std::thread verhält sich wie jeder andere Typ.
+2

Wir sollten auch erwähnen, dass der Eltern-Thread beim Aufrufen von 'detach' normalerweise keinen Bezug auf das Kind hat. Beim Aufruf von 'join' sollte dies jedoch geschehen. – AndyG

5

Um mehr über die zweite Frage auszuarbeiten, die temporäre std::thread Objekt verhält sich wie jedes andere temporäre Objekt:

Es nach dem full expression zerstört wird es gebunden ist, wird ausgewertet, die the destructor bedeutet immer nach der angerufene .detach() Anruf - std::terminate() wird nicht angerufen.

Verwandte Themen