考虑范围
{
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两种方式移植?
答案 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));
}