async的未来在异步任务完成后保留参数副本

时间:2016-02-06 02:39:41

标签: multithreading c++11 asynchronous future

考虑范围

{
  std::shared_ptr<T> data = new T();
  std::future f = std::async(std::launch::async, operation, data);
  keep_for_later(std::move(f));
}

其中keep_for_later()将未来存放在鞋盒中一段时间​​,而operation()相当快地完成。

我看到类型T的对象在operation()返回时没有被销毁,而是在任意长时间内保持活着,只要future返回async()电话未被销毁。

显然,async()必须复制其参数,并保持这些副本处于活动状态,直到异步调用的函数返回为止。但是对我来说似乎不是最理想的,一旦函数完成就不会销毁这些副本,就像在正常的同步函数调用中销毁临时参数一样(如果我只调用operation(std::shared_ptr<T>(data))而不是通过async() ,只会在调用的生命周期内创建一个临时对象)。我只是在处理草率的实施吗?

是否有一种C ++ 11可移植的方法来防止临时副本的生命周期与返回的未来相关联?

如果(我怀疑)没有,是否有替代的std::async() - 类似的实现允许(例如在Boost中),我可以使用Microsoft cl和gcc两种方式移植?

1 个答案:

答案 0 :(得分:0)

&#39;数据&#39;在你的功能范围内仍然存在....所以,当异步运行时,至少有2个副本....如果你想阻止它,移动数据&#39;进入异步

{
    std::shared_ptr<T> data = new T();
    std::future f = std::async(std::launch::async, operation, std::move(data));
   keep_for_later(std::move(f));

}