作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图理解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;
}
Hello from thread 2
Hello from thread 3
Hello from thread 3
Hello from thread 4
Hello from thread 5
最佳答案
[&]
语法导致i
被引用捕获。因此,当线程运行时,i
通常会比您预期的更高级。更严重的是,如果在线程运行之前i
超出范围,则代码的行为是不确定的。
按值捕获i
-即std::thread([i](){ print_id(i); })
是解决方法。
关于c++ - 循环内的c++线程会打印错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60093210/
我是一名优秀的程序员,十分优秀!