multithreading - async's future holds on to copies of arguments after async task completes -
consider scope
{ std::shared_ptr<t> data = new t(); std::future f = std::async(std::launch::async, operation, data); keep_for_later(std::move(f)); } where keep_for_later() stores future in shoebox while, while operation() completes quickly.
i seeing object of type t not destroyed upon operation()'s return, rather kept alive arbitrarily long time, long future returned async() call not destroyed.
obviously, async() must copy parameters, , hold these copies alive until asynchronously invoked function returns. seems suboptimal me these copies not destroyed function done, temporary arguments destroyed in normal synchronous function call (if called operation(std::shared_ptr<t>(data)) instead of through async(), temporary object created lifetime of call). dealing sloppy implementation?
is there c++11 portable way prevent association of lifetime of temporary copies returned future?
if (as suspect) there none, there alternative std::async()-like implementation allow (e. g. in boost), can use portably both microsoft cl , gcc?
'data' still alive within function scope.... so, while async running, there @ least 2 copies.... if want prevent that, move 'data' async
{ 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)); }
Comments
Post a Comment