diff --git a/.gitignore b/.gitignore index 07ad1ce..4bf4815 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ classes lvalues bad_alloc rtti +future diff --git a/CMakeLists.txt b/CMakeLists.txt index 7a66a9d..be37d00 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,3 +18,6 @@ add_executable(classes classes.cpp) add_executable(lvalues lvalues.cpp) add_executable(bad_alloc bad_alloc.cpp) add_executable(rtti rtti.cpp) + +add_executable(future future.cpp) +set_target_properties(future PROPERTIES LINK_FLAGS "-pthread") diff --git a/future.cpp b/future.cpp new file mode 100644 index 0000000..26384d8 --- /dev/null +++ b/future.cpp @@ -0,0 +1,47 @@ +// future example +// adapted from http://www.cplusplus.com/reference/future/future/ + +#include // std::cout +#include // std::async, std::future +#include // std::chrono::milliseconds + +// a non-optimized way of checking for prime numbers. +bool is_prime (int x) { + for (int i=2; i fut = std::async(std::launch::async, is_prime, p); + + // do something while waiting for function to set future: + std::cout << "checking, please wait" << std::flush; + std::chrono::milliseconds span(500); + while (fut.wait_for(span) == std::future_status::timeout) { + std::cout << '.' << std::flush; + } + std::cout << std::endl; + + bool x = fut.get(); // retrieve return value + std::cout << p << " " << (x?"is":"is not") << " prime." << std::endl; +} + +void implicitly_waiting() { + int p2 = 838041641; + + std::future fut = std::async(std::launch::async, is_prime, p2); + std::cout << "just getting the result, doing an implicit wait():" << std::endl; + bool x = fut.get(); + std::cout << p2 << " " << (x?"is":"is not") << " prime." << std::endl; +} + +int main () { + explicitly_waiting(); + implicitly_waiting(); + return 0; +}