Когда мне нужно использовать std :: async (std :: launch :: async, func ()) вместо func ()?

У меня нет причины использовать std::async с std::lauch::async, вместо простого вызова функции, переданной в std::async. Есть ли специальные гарантии?

4 голоса | спросил Guillaume07 21 42013vEurope/Moscow11bEurope/MoscowThu, 21 Nov 2013 18:03:51 +0400 2013, 18:03:51

2 ответа


0

Согласно документации , есть перегрузка, которая просто принимает функцию и ее аргументы. Вы используете перегрузку, которая принимает более конкретную политику .

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

Вызов , который вы используете, предоставив только std::launch::async, гарантирует, что функция точно выполняется в своем собственном потоке, избегая любой работы, блокирующей вызывающий поток.

Оба варианта, конечно, по-прежнему полностью отличаются от простого прямого вызова f(args...), что гарантирует немедленную оценку.

ответил Lightness Races in Orbit 21 42013vEurope/Moscow11bEurope/MoscowThu, 21 Nov 2013 18:20:41 +0400 2013, 18:20:41
0

Да, вызывающий поток не блокируется, потому что std :: async генерирует отдельный поток для вызова функции. Это означает, что если вы нажмете кнопку GUI, чтобы начать обработку сложной задачи, которая займет несколько минут, то ответы GUI, хотя обработка еще не завершена.

ответил DarthB 21 42013vEurope/Moscow11bEurope/MoscowThu, 21 Nov 2013 18:12:13 +0400 2013, 18:12:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132