Launch a small asynchronous task and collect its value through a future.

future `std::future::get()` waits for the asynchronous task and returns its result.
task The task body is separate from the caller, so replay can show a worker thread producing the subtotal before the caller uses it.

Async Future Sum

base
async_future_sum.cpp
Replay: real traced execution (multi-file project)
#include <future>
#include <iostream>

int computeSubtotal(int base) {
    int doubled = base * 2;
    return doubled + 1;
}

int main() {
    int base = 4;

    auto subtotal = std::async(std::launch::async, computeSubtotal, base);

    int result = subtotal.get();
    int finalScore = result + base;

    std::cout << "base=" << base << std::endl;
    std::cout << "final=" << finalScore << std::endl;
    return 0;
}
#include <future>
#include <iostream>

int computeSubtotal(int base) {
    int doubled = base * 2;
    return doubled + 1;
}

int main() {
    int base = 2;

    auto subtotal = std::async(std::launch::async, computeSubtotal, base);

    int result = subtotal.get();
    int finalScore = result + base;

    std::cout << "base=" << base << std::endl;
    std::cout << "final=" << finalScore << std::endl;
    return 0;
}
#include <future>
#include <iostream>

int computeSubtotal(int base) {
    int doubled = base * 2;
    return doubled + 1;
}

int main() {
    int base = 6;

    auto subtotal = std::async(std::launch::async, computeSubtotal, base);

    int result = subtotal.get();
    int finalScore = result + base;

    std::cout << "base=" << base << std::endl;
    std::cout << "final=" << finalScore << std::endl;
    return 0;
}
  1. base ← 4, subtotal ← (empty)

    9int main() {10    int base→ 4 = 4; //@base=2, 61112    auto subtotal→ (empty) = std::async(std::launch::async, computeSubtotal1, base4);1314    int result = subtotal(empty).get();15    int finalScore = result + base;
  2. doubled ← 8

    4int computeSubtotal(int base4) {5    int doubled→ 8 = base4 * 2;6    return doubled8 + 1;7}
  3. result ← 9, finalScore ← 13

    14    int result→ 9 = subtotal(empty).get();15    int finalScore→ 13 = result9 + base4;1617    std::cout << "base=" << base4 << std::endl;18    std::cout << "final=" << finalScore13 << std::endl;19    return 0;20}
    outputbase=4
    final=13
  1. base ← 2, subtotal ← (empty)

    9int main() {10    int base→ 2 = 2;1112    auto subtotal→ (empty) = std::async(std::launch::async, computeSubtotal1, base2);1314    int result = subtotal(empty).get();15    int finalScore = result + base;
  2. doubled ← 4

    4int computeSubtotal(int base2) {5    int doubled→ 4 = base2 * 2;6    return doubled4 + 1;7}
  3. result ← 5, finalScore ← 7

    14    int result→ 5 = subtotal(empty).get();15    int finalScore→ 7 = result5 + base2;1617    std::cout << "base=" << base2 << std::endl;18    std::cout << "final=" << finalScore7 << std::endl;19    return 0;20}
    outputbase=2
    final=7
  1. base ← 6, subtotal ← (empty)

    9int main() {10    int base→ 6 = 6;1112    auto subtotal→ (empty) = std::async(std::launch::async, computeSubtotal1, base6);1314    int result = subtotal(empty).get();15    int finalScore = result + base;
  2. doubled ← 12

    4int computeSubtotal(int base6) {5    int doubled→ 12 = base6 * 2;6    return doubled12 + 1;7}
  3. result ← 13, finalScore ← 19

    14    int result→ 13 = subtotal(empty).get();15    int finalScore→ 19 = result13 + base6;1617    std::cout << "base=" << base6 << std::endl;18    std::cout << "final=" << finalScore19 << std::endl;19    return 0;20}
    outputbase=6
    final=19