J'essaie de comprendre le multi-threading en c ++, mais je suis coincé dans ce problème: si je lance des threads dans une boucle for, ils affichent des valeurs incorrectes. Voici le code:
#include <iostream>
#include <list>
#include <thread>
void print_id(int id){
printf("Hello from thread %d\n", id);
}
int main() {
int n=5;
std::list<std::thread> threads={};
for(int i=0; i<n; i++ ){
threads.emplace_back(std::thread([&](){ print_id(i); }));
}
for(auto& t: threads){
t.join();
}
return 0;
}
Je m'attendais à obtenir imprimé les valeurs 0,1,2,3,4 mais j'ai souvent obtenu la même valeur deux fois. Voici la sortie:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
Qu'est-ce qui me manque?
emplace_back
est étrange: emplace_back
prend une liste d'arguments et la transmet à un constructeur pour std::thread
. Vous avez passé une instance (rvalue) de std::thread
, donc vous allez construire un thread, puis déplacer ce thread dans le vecteur. Cette opération est mieux exprimée par la méthode la plus courante push_back
. Il serait plus judicieux d'écrire threads.emplace_back([i](){ print_id(i); });
(construire sur place) ou threads.push_back(std::thread([i](){ print_id(i); }));
(construire + déplacer) qui sont un peu plus idiomatiques.
i
par la valeur lambda,[i]
.