我试图理解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
。您传递了的(右值)实例std::thread
,因此将构造一个线程,然后将该线程移入向量。通过更常用的方法可以更好地表达该操作push_back
。编写threads.emplace_back([i](){ print_id(i); });
(就地构建)或threads.push_back(std::thread([i](){ print_id(i); }));
(构建+移动)较为习惯的做法会更明智。
i
按值传递给lambda ,[i]
。