В чем разница между std::thread и std::async?
Хотелось бы понять, в чем разница между std::thread и std::async в плане организации работы с многопоточностью. Этот вопрос уже задавался вот тут В чем принципиальная разница между std::async (launch) и std::thread?, но мне хотелось бы получить более углубленный ответ.
Мне приходилось использовать потоки вот так:
void funcA() {
// do something
}
...
std::thread t1(funcA);
// do something else
t1.join();
А асинк я использовал вот так
bool funcB() {
bool val;
// do something
return val;
}
...
std::future<bool> futureResultB = std::async(std::launch::async, [&]() {
return funcB();
});
// do something else
auto res = futureResultB.get();
Мне кажется, что эти два куска кода делают практически одно и то же, если не обращать внимание на то, что в одном случае есть возвращаемое значение, а в другом - нет.
Хотелось бы понять, какие особенности работы есть у каждого из этих инструментов, что может один, чего не может другой? Я понимаю, что я использую многопоточку на очень примитивном уровне, поэтому хотелось бы понять, какие возможности предоставляет каждый из способов?