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