Sto cercando di capire il multi-threading in c ++, ma sono bloccato in questo problema: se lancio i thread in un ciclo for, stampano valori errati. Questo è il codice:
#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;
}
Mi aspettavo di stampare i valori 0,1,2,3,4 ma spesso ottenevo lo stesso valore due volte. Questo è l'output:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
Cosa mi manca
emplace_back
è strano: emplace_back
prende un elenco di argomenti e lo passa a un costruttore per std::thread
. Hai passato un'istanza (rvalore) di std::thread
, quindi costruirai un thread, quindi sposterai quel thread nel vettore. Tale operazione è meglio espressa dal metodo più comune push_back
. Sarebbe più sensato scrivere threads.emplace_back([i](){ print_id(i); });
(costruire sul posto) o threads.push_back(std::thread([i](){ print_id(i); }));
(costruire + spostare) che sono in qualche modo più idiomatici.
i
per valore di lambda,[i]
.