2016-02-06 2 views
0

Рассмотрим сферу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?

+0

Что такое подпись 'operation'? Можете ли вы его изменить? –

+0

'void operation (std :: shared_ptr )', и это может быть все, что я хочу. Но 'T' уже управляется с помощью умного указателя, подсчитанного по рефлектометру, поэтому не так много места для маневра. У вас есть идея? – kkm

+0

Если он принимает значение 'shared_ptr' по значению, вы не должны иметь эту проблему в соответствующей реализации. Пример: http://coliru.stacked-crooked.com/a/cb47a81653952111. Немного измененный, http://webcompiler.cloudapp.net/ также ведет себя корректно. –

ответ

0

«данные» по-прежнему живы в пределах вашей видимости функции .... Таким образом, в то время как асинхронный работают, там по крайней мере 2-й экземпляры .... Если вы хотите, чтобы предотвратить это, движение «данные» в асинхронный

{ 
    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)); 

+0

Это не вопрос, и это не решит проблему. Дело в том, что после этой области и области действия , то объект все еще жив. Вы * можете * помочь одной ссылке из двух умирать быстрее (при условии, что shared_p tr оптимизированный ход), но это * вторая * ссылка где-то в кишках асинхронной сантехники, которая держит объект навсегда. – kkm

+0

Хорошо. Простите, просто прочитайте комментарии к своему вопросу .. кажется, вы решили. правильно? – WhiZTiM

+0

Ну, так как я еще не могу получить обновленную библиотеку, даже предварительный просмотр, а MS не дает ETA, возможно, я по-прежнему буду полезен, если предложит переносимую библиотеку, которую я могу использовать вместо 'std: async()' ,В настоящее время на моем расписании есть еще время, чтобы просто дождаться обновления MSVS 2015 Update 2, но есть определенная степень неопределенности, пока я не получу его и не подтвержу исправление. Я бы не сказал, что проблема решена. – kkm

Смежные вопросы