std :: async - 参数向量已损坏

 mobiledu2502875697 发布于 2022-12-07 14:32

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

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

// Calling part
std::vector> futures;
std::vector> 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 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 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是主矢量,它被分成小矢量.问题是当我传递一个向量时func(),在函数中它变为无效,大小为0或无效元素.但是当我尝试调用该函数时,std::async一切正常.

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

感谢您的时间!

1 个回答
  • 如果在迭代扩展向量时发生重新分配temps,则std::ref(temps.back())线程很可能正在引用已经失效的内存区域.您可以通过在连续push_backs 之前保留内存来避免重定位:

    temps.reserve(threadCount);
    

    2022-12-11 02:06 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有