使用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

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐