В чем разница между 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();

Мне кажется, что эти два куска кода делают практически одно и то же, если не обращать внимание на то, что в одном случае есть возвращаемое значение, а в другом - нет.

Хотелось бы понять, какие особенности работы есть у каждого из этих инструментов, что может один, чего не может другой? Я понимаю, что я использую многопоточку на очень примитивном уровне, поэтому хотелось бы понять, какие возможности предоставляет каждый из способов?


Ответы (1 шт):

Автор решения: Никита Самоуков

std::thread если нужно ручное управление потоками, но в апи ОС лезть не хочется. Для пуула например.

std::async если нужно тупо запустить код в другом потоке. Как конкретно он запустится там на новом потоке или на ранее созданном заранее неясно. Тут как стд реализовали. Лучше приоритет потока в таком коде не выставлять.

→ Ссылка