Maison >développement back-end >C++ >Pourquoi la transmission de références d'objet aux threads provoque-t-elle des erreurs de compilation et comment `std::ref` peut-il aider ?

Pourquoi la transmission de références d'objet aux threads provoque-t-elle des erreurs de compilation et comment `std::ref` peut-il aider ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 01:42:09866parcourir

Why Does Passing Object References to Threads Cause Compilation Errors, and How Can `std::ref` Help?

Comprendre l'échec de la compilation lors de la transmission de références d'objet aux fonctions de thread

Lors de la tentative de transmission d'une référence à un objet, tel qu'un std::ostream, à un thread fonction, la compilation peut échouer en raison d'un constructeur supprimé. Ce problème survient car les threads copient généralement leurs arguments pour éviter les problèmes d'alias référentiel.

Pour contourner l'erreur de compilation, il est essentiel d'utiliser std::ref (ou std::cref pour les références constantes). std::ref vous permet d'envelopper une référence avec une sémantique de valeur, vous permettant de copier le wrapper en toute sécurité.

std::thread t(foo, std::ref(std::cout));

Ici, le wrapper std::ref fournit un objet copiable qui contient la référence à std : :cout. Par conséquent, le thread peut le copier avec succès et exécuter la fonction correctement.

N'oubliez pas que ce code ne fonctionnera que tant que l'objet référencé reste valide. Il est crucial de s'assurer que la durée de vie de l'objet dépasse la durée d'exécution du thread. Le non-respect de cela peut entraîner un comportement indéfini.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn