For many years, the increase in computing power of modern devices is achieved not
by increasing the clock frequency and bandwidth of CPUs, but by using hyper-threaded and
multicore architectures. This simple change in approach to the CPU design led to
dramatic changes in the organization of computing and became a turning point for
software developers. Software that is going to take advantage of the increased computing
power of multi-core architectures must be designed to be able to perform multiple tasks
simultaneously. When covering the topic of parallel/simultaneous computing, scientists
and IT professionals use two terms: (1) parallelism and (2) concurrency. A third
important term when considering parallel/simultaneous computing is “multithreading”. In
C++, the two most common ways to implement parallelism are concurrency and parallelism
itself. Although they can be used in other programming languages, C++ stands out for its
ability to use concurrent computations with lower-than-average utilization of general
machine resources, as well as its ability to execute complex instructions. The C++11
standard introduced support for multi-threaded programs. The C++ standard recognized the
existence of multithreading in the language and provided components for writing
multithreaded programs in the <thread> library. This made it possible to write
multithreaded programs in C++ without relying on platform-specific extensions and
enabled the creation of portable multithreaded code with guaranteed behavior. The
<thread> library provides extensive opportunities for organizing parallel and
concurrent calculations, it also contains the C++ memory model, conditional variables,
mutexes, etc. for thread synchronization. The article analyzes the possibilities of
writing programs in the C++ using multiple threads for parallel and concurrent execution
of tasks. It also considers the features of the C++ and the tools of the <thread>
library that make parallelism and concurrency possible.