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
Linda Hamiltonoriginal
2024-12-03 12:10:16616parcourir

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);

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);

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));

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!

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