Bei der Übergabe von Objekten an std::thread werden normalerweise Argumente verwendet in den Thread kopiert, anstatt referenziert zu werden. Dieses Verhalten widerspricht der Erwartung, dass durch die Referenzübergabe eine Kopierkonstruktion vermieden werden sollte. Die Verwirrung ergibt sich aus der Unterscheidung zwischen Referenzen und Zeigern in C.
In C bedeutet die Übergabe eines Objekts per Referenz im Allgemeinen die Übergabe seiner Adresse, was der Übergabe gleichkommt ein Zeiger. Allerdings verfügt std::thread über eine spezifische Implementierung, die erfordert, dass seine Argumente nach Wert kopiert werden.
Um Referenzsemantik zu erreichen, verwenden Sie std::reference_wrapper wie folgt:
std::thread newThread(session, &sock, std::ref(logger));
Auf diese Weise wird der Logger nicht kopiert, sondern seine Referenz wird an den Thread übergeben. Beachten Sie, dass der Logger den Thread überleben muss.
Die Verwendung von std::move() wird in diesem Fall nicht empfohlen, da std::thread erwartet, dass Argumente kopiert werden. Durch das Verschieben des Objekts würde der Besitz seines Speichers auf den Thread übertragen, was möglicherweise unerwünscht ist.
Wenn Ihr Code zuvor mit std::move() funktionierte, jetzt aber fehlschlägt, ist es möglich, dass Ihre Version des Compilers implementiert C 11 nicht vollständig. Erwägen Sie, Ihren Compiler für eine verbesserte C 11-Unterstützung zu aktualisieren.
Das obige ist der detaillierte Inhalt vonWarum ruft die Übergabe eines Objekts per Referenz an std::thread den Kopierkonstruktor auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!