It seems like both languages are equally capable here, with C++ having more power and foot guns when required as usual.
C++ with PPL on Windows, would be
task<T> handle = create_task([] { /* ... */ });
future<T> handle = std::async(std::launch::async, [] { /* ... */ });
C++ with PPL on Windows, would be
And with standard C++ In both cases, with C++20 it will be possible to co_await handle, which you can already play with on clang and VC++.