访问lambda内部循环控制变量

Accessing loop control variable inside lambda

本文关键字:控制变量 循环 内部 lambda 访问      更新时间:2023-10-16

我正在使用以下代码,目的是访问lambda内部的i

for (int i = 0; i < FLAGS_threads; i++) {
  threads[i] = std::thread([=, &client, &tn, &i, &families, &rows, &cols, &val
                          ] {

我发现在每次迭代中,lambda内的i的值是FLAGS_threads

实现我的目标的适当语法是什么?

您需要通过Value 。

捕获

通过参考捕获有两个问题。

首先是所有线程都将共享相同的变量,将其更改为一个线程(甚至是"主"线程(在所有线程中都会更改它。这意味着当循环超过其值时,等于FLAGS_threads(在您的情况下(。

第二个问题更糟:循环内的变量i em local !如果您在循环结束后使用它,请参考它会导致不确定的行为

除非您实际上需要,否则请始终按值捕获。


并且,如果您需要在代码中使用的引用捕获许多变量,也许您应该默认来捕获逐个引用,然后添加i变量的异常?

喜欢

[&, i]() { ... }

,但请记住我上面说的话。您是否真的需要捕获所有通过参考捕获其变量的所有变量?

另一个提示:保持较小的兰伯达。大型Lambdas往往很难阅读和遵循,因此很难维护。也许最好使用功能?或在lambda中调用函数?