2014-02-09 2 views
4

Мне нужно переместить объект на асинхронную функцию, чтобы другая функция управляла моими ресурсами. Но это кажется очень сложным. Например, я хочу отправить fstream для async-функции.Как перенести объект на std :: async()?

void asv(std::ofstream s) 
{ 
//do something. 
} 

Я хочу:

std::ofstream s("afs"); 
std::async(asv,std::move(s)); 

Это не может быть скомпилирован.

Но

std::ofstream s("afs"); 
asv(std::move(s)); 

может быть скомпилирован.

Как я мог это сделать?

ответ

5

Это правильный способ сделать это. (Там нет буквально ничего, чтобы добавить к ответу)

Если вы проверяете его с чем-то вроде Coliru, обратите внимание, что вы не увидите выход из, скажем

void asv(std::string s){ 
    std::cout << s << std::endl; 
} 

, потому что без указания запуска политика (std::launch::async или std::launch::deferred), std::launch::deferred используется, и поэтому асинхронный вызов оценивается лениво. (Он не ждет с оценкой до первого вызова nontimed ожидания на возвращаемом будущем.)


Это предполагает, что вы хотите будущее, а не реальная нить. Если вы хотите настоящую нить, std::thread - это то, что вы хотите.

--- редактировать ---
После недолгих поисков я обнаружил, что libstdC++ hasn't implemented swap and move for file streams (поиск 27.9). Итак, если вы используете GCC или Clang с libstdC++, ответ заключается в том, что вы не можете делать то, о чем вы просите, даже если он полностью соответствует стандарту.

Также кажется, что Visual Studio имеет совершенно другую ошибку, которая, однако, также предотвращает использование этого случая. Для получения дополнительной информации и возможного обходного пути обратитесь к this SO question and answer.В основном, хотя он реализовал конструкторы перемещения, создатель копирует вместо распадов аргументов.

+0

std :: async (asv, std :: move (s)); не может быть скомпилирован. Но asv (std :: move (s)); могут быть скомпилированы. Вы можете неправильно понять мой смысл. – user3186766

+0

@ user3186766 Вы добавили '#include ' директива? http://coliru.stacked-crooked.com/a/c8f31d047d59ef70 – Xarn

+0

Да. Я нахожу, что C++ не может передать ссылку rvalue на функцию <>. – user3186766

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