Maison > développement back-end > C++ > Pourquoi le passage de références d'objet aux threads C provoque-t-il des erreurs de compilation ?

Pourquoi le passage de références d'objet aux threads C provoque-t-il des erreurs de compilation ?

Linda Hamilton
Libérer: 2024-12-03 12:10:16
original
679 Les gens l'ont consulté

Why Does Passing Object References to C   Threads Cause Compilation Errors?

Passer des références d'objet aux fonctions de thread : comprendre les défis

Dans l'interface std::thread de C, transmettre des arguments de référence d'objet au thread les fonctions peuvent rencontrer des erreurs de compilation. Cet article explore les raisons sous-jacentes de ces erreurs et propose des solutions.

Comprendre le passage de références d'objet

Dans l'exemple fourni, un entier (k) peut être transmis à un fonction de thread comme suit :

void foo(int &i) {
    // Do something with i
    std::cout << i << std::endl;
}

int k = 10;
std::thread t(foo, k);
Copier après la connexion

Cependant, tenter de transmettre une référence ostream à une fonction de thread entraîne une compilation error:

void foo(std::ostream &os) {
    // Do something with os
    os << "This should be printed to os" << std::endl;
}

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

Le constructeur supprimé

L'erreur de compilation est enracinée dans le fait que std::thread a un constructeur supprimé qui empêche le passage direct de la référence d'objet. Ceci est intentionnel, car les threads doivent copier leurs arguments pour éviter les conditions de concurrence.

La solution : std::ref

Pour transmettre explicitement une référence d'objet, enveloppez-la avec std::ref (ou std::cref pour les références constantes). Cette solution garantit qu'une copie de la référence est transmise à la fonction thread, garantissant ainsi la sécurité :

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

Préservation de la durée de vie de l'objet

Il est crucial de noter que le Le wrapper de référence contient uniquement une référence à l’objet. Il est donc essentiel de s'assurer que l'objet reste vivant tout au long de l'exécution du thread. Ne pas le faire entraînera 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!

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