async下面的调用是阻塞的,因为返回的未来的析构函数是阻塞的:
void foo() {}
void foo_async() {
std::async(std::launch::async, foo);
}
Run Code Online (Sandbox Code Playgroud)
但我不想阻止!
我正在考虑使用以下解决方法:
void foo_async() {
std::thread(foo).detach();
}
Run Code Online (Sandbox Code Playgroud)
这个可以吗?或者你会推荐一个不同的解决方案?
使用MSVC2012,
以下代码将按预期编译和运行
std::packaged_task< int() > task( []()->int{ std::cout << "hello world" << std::endl; return 0; } );
std::thread t( std::move(task) );
t.join();
Run Code Online (Sandbox Code Playgroud)
而以下代码将无法编译和运行
std::packaged_task< void() > task( [](){ std::cout << "hello world" << std::endl; } );
std::thread t( std::move(task) );
t.join();
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
编辑:作为一种解决方法,可以使用std :: promise在返回void的函数上获取std :: future
std::promise<void> promise;
auto future = promise.get_future();
std::thread thread( [](std::promise<void> &p){ std::cout << "hello world" << std::endl; p.set_value(); }, std::move(promise) );
future.wait();
Run Code Online (Sandbox Code Playgroud)
请注意,带有std :: thread的vs2012库中存在一个错误,它会强制您将promise作为l值引用传递并移动promise,如果按值传递promise或r-则不会编译价值参考.这应该是因为实现使用std :: bind(),它的行为不符合预期.