Рассмотрим сферуASync держит на копии аргументов после завершения задачи асинхронной
{
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()
«s, а продолжает жить сколь угодно долго, до тех пор, как future
возвращенных async()
вызовом не разрушаются.
Очевидно, что async()
должен скопировать его параметры и сохранить эти копии в активном состоянии до тех пор, пока функция асинхронного вызова не вернется. Но мне кажется субоптимальным, что эти копии не уничтожаются, как только функция выполняется, так как временные аргументы будут уничтожены при обычном вызове синхронной функции (если я только что вызвал operation(std::shared_ptr<T>(data))
вместо async()
, временный объект будет создан только на время жизни вызова). Я просто занимаюсь неряшливой реализацией?
Есть ли переносной способ C++ 11 для предотвращения связи срока службы временных копий с возвращенным будущим?
Если (как я подозреваю) нет, существует ли альтернатива std::async()
-подобная реализация, которая позволяет это (например, Boost), что я могу использовать портативно с Microsoft cl и gcc?
Что такое подпись 'operation'? Можете ли вы его изменить? –
'void operation (std :: shared_ptr)', и это может быть все, что я хочу. Но 'T' уже управляется с помощью умного указателя, подсчитанного по рефлектометру, поэтому не так много места для маневра. У вас есть идея? –
kkm
Если он принимает значение 'shared_ptr' по значению, вы не должны иметь эту проблему в соответствующей реализации. Пример: http://coliru.stacked-crooked.com/a/cb47a81653952111. Немного измененный, http://webcompiler.cloudapp.net/ также ведет себя корректно. –