Я намагаюся зрозуміти Multi-Threading в c ++, але я застряг у цій проблемі: якщо я запускаю теми в циклі for, вони друкують неправильні значення. Це код:
#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;
}
Я сподівався отримати друковані значення 0,1,2,3,4, але часто отримував одне і те ж значення двічі. Це вихід:
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
Що мені не вистачає?
emplace_back
непарне: emplace_back
бере список аргументів і передає його конструктору для std::thread
. Ви передали (rvalue) екземпляр std::thread
, отже, побудуєте потік, а потім перемістіть цей потік у вектор. Ця операція краще виражається більш поширеним методом push_back
. Було б розумніше або писати threads.emplace_back([i](){ print_id(i); });
(будувати на місці), або threads.push_back(std::thread([i](){ print_id(i); }));
(конструювати + рухатись), які дещо ідіоматичніші.
i
за значенням до лямбда,[i]
.