使用lambda的时候要注意变量生命周期的变化:
for (int i =0; i < 5; i++) {
int temp = i;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread([&](){
std::thread::id tid = std::this_thread::get_id();
cout << " tid=" << tid<< " " << temp <<endl;
}).detach();
}
使用引用传递的时候,若变量的生命周期结束,那么再次在子线程中访问此变量,其行为未定义。
tid=140671261857536 1
tid=140671261857536 2
tid=140671261857536 3
tid=140671261857536 4
tid=140671261857536 4
可改为:
for (int i =0; i < 5; i++) {
int temp = i;
std::this_thread::sleep_for(std::chrono::seconds(1));
std::thread([](int value){
std::thread::id tid = std::this_thread::get_id();
cout << " tid=" << tid<< " " << value <<endl;
}, temp).detach();
}
结果为:
tid=140661644580608 0
tid=140661644580608 1
tid=140661644580608 2
tid=140661644580608 3
tid=140661644580608 4