多线程lambda数据捕获

版权声明:所有的博客都是个人笔记,交流可以留言或者加QQ:2630492017 https://blog.csdn.net/qq_35976351/article/details/85314020

lambda函数的执行是在真正调用的时候,这和普通函数没有太大区别,只是lambda没有实际的名称而已。lambda的另一个特点是可以捕获周围的变量,捕获的方式分为值和引用。

捕获的是立刻发生的,而不是等到函数调用的时候,只要声明一个lambda而且声明了捕获,那么捕获的动作就会发生。但是注意,如果是传递引用,那么得到的结果是不确定的,因为引用只是原来变量的一个别名,这也是非常危险的行为。

给出代码实例,多线程处理,先声明两个lambda,不立刻调用,但是捕获却立刻发生了。

#include <iostream>
#include <thread>

int main() {
  int a = 0;
  
  auto fun1 = [a]() {  // 函数未调用,但是发生了捕获
    std::cout << "sub thread, res = " << a << std::endl;    
  };

  auto fun2 = [&a]() {  // 函数未调用,但是发生了捕获
    std::cout << "sub thread value, res = " << a << std::endl;    
  };

  ++a;
  std::cout << "main thread reference, res = " << a << std::endl;
  // 以下才是真正执行lambda
  std::thread t1(fun1);
  std::thread t2(fun2);
  t1.join();
  t2.join();

  return 0;
}

输出:

main thread reference, res = 1
sub thread, res = 0
sub thread value, res = 1

使用lamda的好处是可以保留某个时刻的状态,这是其他方式无法做到的。

另一个更加

猜你喜欢

转载自blog.csdn.net/qq_35976351/article/details/85314020
今日推荐