Concurrency and Source Panels
Async Future Sum
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
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;
}
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;doubled ← 8
4int computeSubtotal(int base4) {5 int doubled→ 8 = base4 * 2;6 return doubled8 + 1;7}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
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;doubled ← 4
4int computeSubtotal(int base2) {5 int doubled→ 4 = base2 * 2;6 return doubled4 + 1;7}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
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;doubled ← 12
4int computeSubtotal(int base6) {5 int doubled→ 12 = base6 * 2;6 return doubled12 + 1;7}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