修改在 std::future 的 lambda 中引用捕获的值
Modify values captured by reference in lambda of std::future
有人可以向我解释为什么修改在 std::future 的 lambda 中引用捕获的值不会产生我期望的结果吗?请参阅代码:
const int runs{ 1000 };
for (int run = 0; run < runs; ++run)
{
const int num{ 4 };
std::vector<bool> res(num, false);
std::vector<std::future<void>> futs(num);
for (int i = 0; i < num; ++i)
{
futs[i] = std::async(std::launch::async, [&res, i]
{
res[i] = true;
});
}
for (auto& fut : futs) fut.wait();
for (auto v : res) // I expect all values of res to be set to true.
{
if (!v) std::cerr << "Bad!!!n"; // But this happens!
}
}
你有导致未定义行为的数据竞争。 不同的vector<bool>
项不应由不同的线程同时修改。
你可以在这里阅读它
不保证同一容器中的不同元素可以 由不同的线程同时修改。
或这里
尽管有[res.on.data.races],但实现需要 当所包含对象的内容在 同一容器中的不同元素(矢量除外(是 同时修改。
相关文章:
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- c++ lambda:柯里和函数:使用按值捕获与按引用捕获返回不同的结果
- 引用捕获和在 lambda 中通过引用发送参数有什么区别 (C++)
- 修改在 std::future 的 lambda 中引用捕获的值
- clang++ 9.0 如何神奇地治愈 lambda 中的悬空引用使用?
- 为什么 lambda nullptr 取消引用在这种情况下有效?
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 当lambda执行时,C++lambda捕获的引用具有不同的值
- 无法通过引用捕获 lambda 中的成员变量
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 将引用和指针传递给 lambda
- 为什么访问我的引用捕获变量会导致我的 lambda 函数出现段错误?
- 我无法通过引用捕获传递 lambda
- 我们应该在 lambda 中通过常量引用来捕获吗?
- 在 lambda 中通过引用捕获thread_local变量无法按预期工作
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 列出生成器(lambda的向量)会导致通过引用捕获的非常奇怪的行为
- 无法使用带有常量引用的 lambda 对 std::vector 进行排序
- 为什么在重载的 ostream 运算符中引用 lambda 中的向量会导致错误
- 通过复制和decltype引用Lambda捕获