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!