访问lambda中的循环控制变量

时间:2017-06-22 23:56:11

标签: c++ lambda reference

我正在使用以下代码,目的是访问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

实现目标的正确语法是什么?

1 个答案:

答案 0 :(得分:2)

您需要按值捕获

通过引用捕获有两个问题。

首先,所有线程将共享相同的变量,在一个线程中更改它(甚至&#34; main&#34;线程)在所有线程中更改它。这意味着当循环结束时,其值将等于FLAGS_threads(在您的情况下)。

第二个问题更糟糕:变量i在循环中是 local !如果在循环结束后使用它,那么保持对它的引用将导致未定义的行为

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

如果您需要在代码中使用时通过引用捕获那么多变量,那么您可能应默认使用引用捕获,然后为i变量添加异常?

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

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

另一个提示:保持你的lambda小。大型lambdas往往难以阅读和遵循,因此难以维护。也许使用功能更好?或者在lambda中调用函数?