On modern multi-core compilers, to achieve maximal performance (or just to provide a good user experience), programs usually use multiple threads of execution. Here is a motivating example in which we need to create and fill a big file in a thread that draws the user interface:
#include <cstddef> // for std::size_t bool is_first_run(); // Function that executes for a long time. void fill_file(char fill_char, std::size_t size, const char* filename); // Called in thread that draws a user interface: void example_without_threads() { if (is_first_run()) { // This will be executing for a long time during which // users interface freezes... fill_file(0, 8 * 1024 * 1024, "save_file.txt"); } }