gpt4 book ai didi

c++ - std::async - 参数 vector 已损坏

转载 作者:太空狗 更新时间:2023-10-29 20:03:37 26 4
gpt4 key购买 nike

我想将一个 vector 拆分成多个小 vector ,在一个线程上分别处理它们,然后合并它们。我想使用 std::async 创建线程,我的代码看起来像这样

void func(std::vector<int>& vec)
{
//do some stuff
}

// Calling part
std::vector<std::future<void>> futures;
std::vector<std::vector<int>> temps;
for (int i = 1; i <= threadCount; ++i)
{
auto& curBegin = m_vec.begin() + (i - 1) * size / threadCount;
auto& curEnd = m_vec.begin() + i * size / threadCount;
std::vector<int> tmp(curBegin, curEnd);
temps.push_back(std::move(tmp));

futures.push_back(std::async(std::launch::async, &func, std::ref(temps.back())));
}
for (auto& f : futures)
{
f.wait();
}

std::vector<int> finalVector;
for (int i = 0; i < temps.size() - 1; ++i)
{
std::merge(temps[i].begin(), temps[i].end(), temps[i + 1].begin(), temps[i + 1].end(), std::back_inserter(finalVector));
}

这里 m_vec 是主 vector ,它被拆分成小 vector 。问题是,当我将 vector 传递给 func() 时,在函数中它变得无效,大小为 0 或包含无效元素。但是当我尝试在没有 std::async 的情况下调用该函数时,一切正常。

那么 std::async 有什么问题,有什么我应该做的特别的事情吗?

感谢您的宝贵时间!

最佳答案

如果在迭代扩展 temps vector 时发生了重新分配,那么很可能是 std::ref(temps.back()) 线程操作的是引用一个已经无效的内存区域。您可以通过在连续的 push_back 之前保留内存来避免重定位:

temps.reserve(threadCount);

关于c++ - std::async - 参数 vector 已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27336173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com