Welcome to another exciting lesson at CodeYourCraft! Today, we're diving into the world of C++ asynchronous programming, and we'll be focusing on the std::promise class. This powerful tool is a crucial part of the C++11 standard library, and it's going to make your life easier when dealing with tasks that run concurrently.
In simple terms, std::promise is a class that creates a correlation between a sender and a receiver of a value. It's like a promise that the sender will deliver a value to the receiver at some point in the future. This correlation is established through two associated objects: std::promise and std::future.
Let's start with a simple example. We'll create a std::promise, perform some asynchronous work, and then set the result using the std::promise::set_value() function.
#include <iostream>
#include <future>
#include <thread>
int main() {
std::promise<int> promise;
std::future<int> future = promise.get_future();
std::thread worker([&]() {
std::this_thread::sleep_for(std::chrono::seconds(2));
int result = 42; // Some asynchronous work that produces a result
promise.set_value(result);
});
// Perform other tasks while the asynchronous work is running
std::cout << "Starting the asynchronous work...\n";
worker.join(); // Wait for the asynchronous work to complete
int result = future.get(); // Get the result
std::cout << "The result is: " << result << '\n';
return 0;
}std::promise: This is the object that creates the correlation between the sender and the receiver. It's responsible for managing the value that will be sent later.
std::future: This is the object that receives the value from the std::promise. It can be used to get the result at a later time.
std::thread: This is the C++11 thread class, which is used to run the asynchronous work in a separate thread.
The std::promise class also supports exception handling. If an exception is thrown while performing asynchronous work, it can be propagated to the receiver by calling std::promise::set_exception().
#include <iostream>
#include <stdexcept>
#include <future>
#include <thread>
int main() {
std::promise<void> promise;
std::future<void> future = promise.get_future();
std::thread worker([&]() {
throw std::runtime_error("An error occurred");
});
try {
worker.detach();
future.wait(); // This will throw the exception
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << '\n';
}
return 0;
}What does `std::promise` do in C++?
Stay tuned for more C++ lessons at CodeYourCraft! We'll continue exploring the world of asynchronous programming and delve deeper into the std::promise class. Happy learning! šŖš