Подтвердить что ты не робот

Когда нужно использовать std:: async vs std:: threads?

Может кто-нибудь дать интуицию на высоком уровне о том, когда использовать каждый из них?

Литература:

4b9b3361

Ответ 1

На самом деле это не так - или вещь - вы можете использовать фьючерсы (вместе с promises) с созданным вручную std:: threads. Использование std::async - это удобный способ отключить поток для некоторых асинхронных вычислений и вывести результат обратно через будущее, но std::async в текущем стандарте довольно ограничен. Это станет более полезным, если предлагаемые расширения для включения некоторых идей из Microsoft PPL будут приняты.

В настоящее время std::async, вероятно, лучше всего подходит для обработки как очень длинных вычислений, так и длительной работы IO для довольно простых программ. Однако это не гарантирует низкие накладные расходы (и на самом деле способ, которым он указан, затрудняет реализацию с пулом потоков за кулисами), поэтому он не подходит для более тонких рабочих нагрузок. Для этого вам либо нужно сворачивать свои собственные пулы потоков с помощью std::thread, либо использовать что-то вроде Microsoft PPL или Intel TBB.

Вы также можете использовать std::thread для "традиционного" кода стиля потока POSIX, написанного более современным и портативным способом.

Bartosz Milewski обсуждает некоторые ограничения способа std::async, который в настоящее время указан в его статье Async Tasks в С++ 11: не совсем там

Ответ 2

Одна простая причина, по которой я нашел, - это случай, когда вам нужен способ обнаружения (посредством опроса) выполнения асинхронного задания. С std::thread вы должны управлять этим самостоятельно. С помощью std::async вы можете запросить std::future::valid() (или использовать std::future::wait_for/wait_until(...)), чтобы узнать, когда это будет сделано.