Maison > développement back-end > C++ > le corps du texte

Comment puis-je transmettre en toute sécurité des références d'objet aux threads C 11 ?

Patricia Arquette
Libérer: 2024-11-19 14:57:03
original
513 Les gens l'ont consulté

How Can I Safely Pass Object References to C  11 Threads?

Passer des arguments de référence d'objet aux fonctions de thread : un problème de constructeur

En C 11, l'interface std::thread permet la création de fils légers. Une tâche courante consiste à transmettre des arguments à ces fonctions de thread, mais des difficultés peuvent survenir lors de la tentative de transmission de références d'objet.

Considérez l'exemple suivant :

void foo(int &i) { std::cout << i << std::endl; }
int k = 10;
std::thread t(foo, k);
Copier après la connexion

Ce code est compilé et exécuté avec succès, comme les entiers sont copiés dans la fonction thread. Cependant, passer une référence d'objet std::ostream ne compile pas :

void foo(std::ostream &os) { os << "This should be printed to os" << std::endl; }
std::thread t(foo, std::cout);
Copier après la connexion

L'erreur indique un constructeur manquant ou inaccessible.

Solution : Utilisation de std::ref

Les threads copient leurs arguments par défaut. Pour transmettre explicitement une référence, une approche alternative est nécessaire. C'est là qu'intervient std::ref. Il encapsule une référence d'objet dans un wrapper de valeur-sémantique.

En utilisant std::ref, la fonction thread reçoit une copie du wrapper, mais la référence encapsulée reste la même chose :

std::thread t(foo, std::ref(std::cout));
Copier après la connexion

Cela permet à la fonction thread d'accéder et de modifier l'objet d'origine, permettant ainsi la fonctionnalité souhaitée.

Il est crucial de noter que l'objet référencé doit rester accessible tout au long l'exécution du fil. S'il est supprimé ou modifié avant la fin du fil de discussion, un comportement inattendu ou des plantages peuvent survenir.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal