Lors du passage d'objets à std::thread, les arguments sont généralement copié dans le fil de discussion, plutôt que d'être référencé. Ce comportement contredit l'attente selon laquelle le passage par référence devrait éviter la construction de copie. La confusion vient de la distinction entre références et pointeurs en C .
En C , passer un objet par référence signifie généralement passer son adresse, ce qui équivaut à passer un pointeur. Cependant, std::thread a une implémentation spécifique qui nécessite que ses arguments soient copiés par valeur.
Pour obtenir la sémantique de référence, utilisez std::reference_wrapper comme suit :
std::thread newThread(session, &sock, std::ref(logger));
De cette façon, logger n'est pas copié, mais sa référence est plutôt transmise au thread. Notez que l'enregistreur doit survivre au thread.
L'utilisation de std::move() n'est pas recommandée dans ce cas car std::thread s'attend à ce que les arguments soient copiés. Déplacer l'objet transférerait la propriété de sa mémoire au thread, ce qui n'est peut-être pas souhaité.
Si votre code fonctionnait auparavant avec std::move() mais échoue maintenant, il est possible que votre version du compilateur n'implémente pas entièrement C 11. Pensez à mettre à jour votre compilateur pour une prise en charge améliorée de C 11.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!