Может кто-нибудь дать интуицию на высоком уровне о том, когда использовать каждый из них?
Литература:
Может кто-нибудь дать интуицию на высоком уровне о том, когда использовать каждый из них?
Литература:
На самом деле это не так - или вещь - вы можете использовать фьючерсы (вместе с 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: не совсем там
Одна простая причина, по которой я нашел, - это случай, когда вам нужен способ обнаружения (посредством опроса) выполнения асинхронного задания. С std::thread
вы должны управлять этим самостоятельно. С помощью std::async
вы можете запросить std::future::valid()
(или использовать std::future::wait_for/wait_until(...)
), чтобы узнать, когда это будет сделано.