【问题标题】:boost thread_group move ownership of unique_ptr to threadboost thread_group 将 unique_ptr 的所有权移至线程
【发布时间】:2016-06-06 02:45:09
【问题描述】:

有什么解决方法可以让这段代码运行?该代码导致“尝试引用已删除的函数”。 unique_ptr 在循环中分配,然后传递给线程,后来又被删除了。

boost::thread_group threads;
std::unique_ptr<ScenarioResult> scenario_result;

while ((scenario_result = scenarioStock.getNextScenario()) != nullptr)
{
threads.create_thread(boost::bind(&Simulation::RunSimulation, boost::ref(grid_sim), std::move(scenario_result)));
}

【问题讨论】:

  • minimal reproducible example 不仅可以将实际的错误消息复制到问题中,而且还可以提供很多帮助,而不仅仅是您目前添加的缩写版本。

标签: c++ multithreading c++11 boost unique-ptr


【解决方案1】:

您可以使用 lambda 表达式代替 boost::bind

threads.create_thread([&] { grid_sim.RunSimulation(std::move(scenario_result)); });

您正在做的问题是 create_thread 尝试复制 bind 创建的函子,但由于 unique_ptr 绑定参数的存在使得函子只能移动。

【讨论】:

  • 可以@Praetorian 看看这个问题的扩展在这里:stackoverflow.com/questions/35611780/…
  • @Tims 为什么要将Result 的所有权传递给RunSimulation?在我看来,您需要一个 Results 的容器,将对每个容器的引用传递给一个线程,然后在线程完成它正在做的事情时检查 Result
  • 我想在处理完结果后立即将其丢弃,而不是将其放入容器中
  • @Tims 好吧,您可以在 main 中读取结果后立即擦除容器中的元素。或者,也许您应该查看future/promise/packaged_task,以便在thread 和调用者之间传递Result
猜你喜欢
  • 1970-01-01
  • 2015-04-04
  • 2020-03-19
  • 2011-11-05
  • 2022-01-24
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
相关资源
最近更新 更多