【问题标题】:Passing unique ptr to an async method将唯一 ptr 传递给异步方法
【发布时间】:2020-04-14 18:28:08
【问题描述】:

我正在尝试在 unique_ptrs 的向量上异步调用 reset()

std::vector<std::unique_ptr<SomeClass>> myVector;
for (auto& keyVal : myVector) {
  future<void> f = async(launch::async, [=]() {
    keyVal.second.reset();
  });
  listOfFutures.push_back();
}

这不起作用有两个原因:

  • unique_ptrreset()函数没有标记const,但是unique_ptr在复制时默认得到const

  • 如果我将 async 函数标记为 mutable,编译器会告诉我我正在调用隐式删除的复制构造函数,我不明白。

【问题讨论】:

  • 如果你设法为该 unique_ptr 创建了一个非常量引用,它就不再是一个唯一的 ptr - 你将有两个对它的引用。失败的目的。
  • 是的,这也是我的想法,但必须有一种更简洁的方法来异步调用唯一 ptrs 上的重置,而不会将它们从原始结构中删除。
  • @sublime 不,因为那样它将不再是唯一指针,您将有两种方法来控制对象的生命周期。如果你想使用std::shared_ptr
  • 顺便说一句,您的目标是什么?你想解决什么问题?
  • 您不想使用move 解决方案的原因是什么?您在 lamda 中重置了 unique_ptr,这表明您将不再在它之外使用它。

标签: c++ asynchronous c++14 c++17 unique-ptr


【解决方案1】:

我认为这可以满足您的需求。

for (auto& keyVal : myMap) {
    future<void> f = async(launch::async, [&ptr = keyVal.second] () mutable {
      ptr.reset();
    });
    listOfFutures.push_back();
}

但是,这是一个坏主意,因为 unique_ptr 指向的数据可能随时被删除。因此,您应该只将您的版本与 std::move 一起使用。

编辑:表示这是一个坏主意,正如 cmets 中指出的那样

【讨论】:

  • 编译并不一定能成功。这几乎是一个等待春天的诱杀装置。
  • 真的这是个坏主意。但我认为它回答了所提出的问题。
  • 如果你要提供这个答案,你至少应该提供警告,说明这完全破坏了std::unique_ptr的意义
  • 非常清楚这个答案的缺点。正如我的一位老朋友曾经说过的那样,“不要把这样的代码留在身边。有些孩子会找到它。”
  • @sublime 因为它以大致相同的速度运行(移动 unique_ptr 很便宜),并且无论如何您都无法访问 myMap 中的 unique_ptr,因为它可以在非线程安全的非线程中随时重置-原子方式。
猜你喜欢
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-09
相关资源
最近更新 更多