Estoy tratando de entender Multi-threading en c ++, pero estoy atrapado en este problema: si inicio hilos en un bucle for, imprimen valores incorrectos. Este es el código:
#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;
}
Esperaba que me imprimieran los valores 0,1,2,3,4 pero a menudo obtuve el mismo valor dos veces. Esta es la salida:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
¿Qué me estoy perdiendo?
emplace_back
es extraño: emplace_back
toma una lista de argumentos y la pasa a un constructor para std::thread
. Ha pasado una instancia (rvalue) de std::thread
, por lo tanto, construirá un hilo y luego lo moverá al vector. Esa operación se expresa mejor por el método más común push_back
. Sería más sensato escribir threads.emplace_back([i](){ print_id(i); });
(construir en el lugar) o threads.push_back(std::thread([i](){ print_id(i); }));
(construir + mover), que son algo más idiomáticos.
i
por el valor de lambda,[i]
.