Почему блокировка?
std::async();
возвращает std::future
временный объект
- временный объект немедленно уничтожается, вызывая desctructor.
std::future
деструктор блокирует. Это плохо и хлопотно.
Почему присвоение в порядке?
При присваивании переменной возвращаемый объект уничтожается не сразу, а позже, до конца области действия вашего вызывающего кода.
Пример кода: main1
в порядке. main2
и main3
эквивалентно блокируют основной поток.
void forever() {
while (true);
}
void main1() {
std::future<void> p = std::async(std::launch::async, forever);
std::cout << "printing" << std::endl; // can print, then forever blocking
}
void main2() {
std::async(std::launch::async, forever);
std::cout << "printing" << std::endl; // forever blocking first, cannot print
}
void main3() {
{std::future<void> p = std::async(std::launch::async, forever);}
std::cout << "printing" << std::endl; // forever blocking first, cannot print
}
Взгляните на cplusplus.com
Возвращаемое значение std :: async
Когда выбрано launch :: async, возвращаемое будущее связывается с
конец созданного потока, даже если к его общему состоянию никогда не обращаются:
в этом случае его деструктор синхронизируется с возвращением fn.
Следовательно, возвращаемое значение не должно игнорироваться для асинхронного
поведение, даже когда fn возвращает void.