修改在 std::future 的 lambda 中引用捕获的值

Modify values captured by reference in lambda of std::future

本文关键字:引用 lambda future 修改 std      更新时间:2023-10-16

有人可以向我解释为什么修改在 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],但实现需要 当所包含对象的内容在 同一容器中的不同元素(矢量除外(是 同时修改。