std::async is also able to make threads. Compared to std::thread it is considered less powerful but easier to use when you just want to run a function asynchronously.

Asynchronously calling a function

#include <future>
#include <iostream>

unsigned int square(unsigned int i){
    return i*i;
}

int main() {
    auto f = std::async(std::launch::async, square, 8);
    std::cout << "square currently running\\n"; //do something while square is running
    std::cout << "result is " << f.get() << '\\n'; //getting the result from square
}

Common Pitfalls

std::async(std::launch::async, square, 5);
//thread already completed at this point, because the returning future got destroyed

More on async on Futures and Promises