【问题标题】:C++ vector of futures access violation期货访问冲突的 C++ 向量
【发布时间】:2023-02-12 02:29:49
【问题描述】:

我正在尝试使用 std::async 在 C++ 中使用 futures 进行一些多线程处理。我需要创建一堆对象,其构造函数并行执行一些序列化。我正在调用一个调用构造函数并向对象返回 shared_ptr 的函数。我用 std::async 调用这个函数,并创建一个由这个函数返回的未来向量,然后在一个循环中对每个未来调用 .get(),我认为这将是一个阻塞调用,但这是我在调试器中得到异常的地方。我不确定发生了什么。

这是一个可重现示例的简化版本,当使用 C++17 编译时,它会抛出 MSVC 14.3+ 异常

#include <iostream>
#include <vector>
#include <future>
#include <memory>
#include <numeric>

struct TaskUnit {
  std::vector<int> preds;
  int vertex;
};

struct Task {
  std::vector<TaskUnit> units;
  int task_id;

  Task(std::vector<TaskUnit> const& units, int const id)
    : units(units), task_id(task_id) {}

  static std::shared_ptr<Task const>
    Create(std::vector<TaskUnit> const& units, int const id)
  {
    return std::make_shared<Task const>(units, id);
  }
};

auto ConstructTask(int const task_count)
{
  std::vector<TaskUnit> units{ {{1,2}, 1}};
  return std::async(std::launch::async, Task::Create, std::cref(units), task_count);
}

auto ConstructTasks(int const n_tasks)
{
  std::vector<std::future<std::shared_ptr<Task const>>> futures;
  std::vector<int> range(n_tasks);
  std::iota(range.begin(), range.end(), 0);
  for (auto const& task_count : range)
  {
    futures.push_back(ConstructTask(task_count));
  }
  std::vector<std::shared_ptr<Task const>> tasks;
  for (auto& future : futures)
  {
    tasks.push_back(future.get());
  }
  return tasks;
}

int main()
{
    auto tasks = ConstructTasks(10);
    for (auto const& task : tasks)
    {
      std::cout << task->task_id;
    }
}

【问题讨论】:

    标签: c++ multithreading c++11 asynchronous


    【解决方案1】:

    您传递了对 std::vector&lt;TaskUnit&gt; 的引用,该引用超出范围并在函数返回时终止。改为按值传递:

    auto ConstructTask(int const task_count) {
        std::vector<TaskUnit> units{{{1, 2}, 1}};
        return std::async(std::launch::async, Task::Create, units, task_count);
    //                                                      ^^^^^
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多