我正在使用以下代码,目的是访问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
。
实现目标的正确语法是什么?
答案 0 :(得分:2)
您需要按值捕获。
通过引用捕获有两个问题。
首先,所有线程将共享相同的变量,在一个线程中更改它(甚至&#34; main&#34;线程)在所有线程中更改它。这意味着当循环结束时,其值将等于FLAGS_threads
(在您的情况下)。
第二个问题更糟糕:变量i
在循环中是 local !如果在循环结束后使用它,那么保持对它的引用将导致未定义的行为。
除非您实际需要,否则始终按值捕获。
如果您需要在代码中使用时通过引用捕获那么多变量,那么您可能应默认使用引用捕获,然后为i
变量添加异常?
像
[&, i]() { ... }
但请记住我上面所说的话。您真的是否需要通过引用捕获所有变量?
另一个提示:保持你的lambda小。大型lambdas往往难以阅读和遵循,因此难以维护。也许使用功能更好?或者在lambda中调用函数?