- 主题:CPP实在是太复杂了 (转载)
lamda和多线程有什么关系?或者说,不用lamda,多线程本身该跑飞还是会跑飞
我的理解
如果lamda没有捕获/访问额外的变量,全部都靠传入参数,那么它就是一个实现了运算符()的匿名对象,这个对象除了一个()运算符,没有其它成员变量,运行结果取决于传入参数以及函数体的逻辑
如果lamda有捕获/访问周边的变量,则它就是一个匿名的、除了运算符()之外,还保存了捕获变量的(值或者引用)的一个对象,运行结果不仅取决于传入参数以及函数体的逻辑,还会被捕获的变量影响。至于跑飞,则是因为捕获的变量有的是引用,有的虽然是值,但是实际上有公共的引用计数,所以是这些捕获导致的跑飞,而这些如果会导致跑飞,你不用lamda,用别的方式传递这些捕获的变量,该跑飞还是会跑飞
所以,这个多线程跑飞的锅,和lamda没关系
【 在 xiaoju 的大作中提到: 】
: 多线程很容易搞出来循环引用,用rc处理不了
:
--
FROM 113.120.108.*
这种初级的lamda没有必要存在/用,这是为了lamda而lamda
【 在 rexxie 的大作中提到: 】
: c++ 的lambda 配和c#比么?
: std::vector<int> some_list;
: int total = 0;
: ...................
--
FROM 113.120.108.*
我认为lamda的运用并没有改变本质逻辑,如果说有人因此出了问题,是因为对capture本身的原理,以及更主要的对share_ptr的理解不够造成的,说的白一点,锅更多的是shared_ptr的
而且,这种所谓因为capture share_ptr造成的循环引用,其实也和多线程没关系
https://stackoverflow.com/questions/18818260/passing-shared-ptr-to-lambda-by-value-leaks-memory/18818407
【 在 xiaoju 的大作中提到: 】
: 不是跑飞,是容易构成很难察觉的循环引用
: C++的shared_ptr在capture时的限制不是没原因的
:
--
FROM 113.120.108.*