C++C++11C++14C++17Learn C++

What Are Atomic Add And Sub Operations In C++?

What Are Atomic Add And Sub Operations In C++

The concurrency support library in modern C++ is designed to solve problems in multi-thread operations. Since the C++11 standard, this library includes built-in support for threads (std::thread) with atomic operations (std::atomic). In this post, we explain two atomic operations that can be used with std::atomic types, we explain what are atomic addition and subtraction operations.

What is atomic (std::atomic) in C++?

C++11 adds atomic types and operations to the standard. Atomic types and operations provide a way of writing multi-threaded applications without using locks. In modern C++, the std::atomic<> template class is defined in the <atomic> header and it can be used to wrap other types to do atomic operations on that type. When a thread writes to an atomic object another thread can read from it. Every instantiation and full specialization of the std::atomic template defines an atomic type.

Atomic types ensure any read or write operation synchronizes as part of multi-thread operations, (i.e. using these types in std::thread). They work well on private types (i.e. int, float, double, etc.) or any type that is trivially copyable types which means it has at least one eligible copy constructor, move constructor, copy assignment operator, or move assignment operator and has non-deleted trivial destructor.

Here is a simple syntax for the atomic declaration:

Here is a simple std::atomic example:

Atomic operations are operations on the of values atomic types (std::atomic objects) in the atomic library that allows lockless concurrent programming. These operations are good in data races and these objects are free of data races. Different atomic operations can be done on the same atomic object in their sync. std::atomic has many features to be used in atomic operations, Let’s see some of these addition and subtract operations now.

What are atomic add and sub operations in C++?

Atomic types can be used in operations as in standard C++ types, For example we can do addition and subtract as below,

What are fetch_add and fetch_sub operations in C++?

The fetch_add is an atomic addition operation that atomically replaces the current value with the result of arithmetic addition of the given value.
The fetch_sub is an atomic addition operation that atomically replaces the current value with the result of arithmetic subtraction of the given value.
Here the fetch term allows these operations to be done in read, modify and write orders. Here is an example

When these operations are called, atomic_fetch_add and atomic_fetch_sub operations are called respectively. Note that, these operations can be used with memory orders (std::memory_order) too.

What are atomic_fetch_add and atomic_fetch_sub operations in modern C++?

The std::atomic_fetch_add is an atomic addition operation that atomically adds given arguments to the value of pointed object parameter.
The std::atomic_fetch_sub is an atomic addition operation that atomically subtracts given arguments from the value of pointed object parameter.

Here the fetch term allows these operations to be done in read, modify and write orders. Here is an example

These operations are performed when the atomic_add and atomic_sub operations are called respectively. Note that, these operations can be used with memory orders (std::memory_order) too.

What are atomic add and sub operations with lambdas in C++?

We can use atomic operations with lambdas, for example we can create add and sub lambdas as below,

Is there a full example of how to use atomic add and sub operations in C++?

Here is a full example that uses all types of add and sub operations with lambda and thread example too,

Here the output result is 10; zero from myf(), 16 from add lambdas and -6 from sub lambdas.

Note that, every operation on these atomic types are called as atomic operation, there are logical operators too. For more information on this feature, see Atomic operations Proposal document.

What Are Atomic Add And Sub Operations In C++ C++ Builder logo

C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, MacOS, iOS & Android operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs.

There is a free C++ Builder Community Edition for students, beginners, and startups; it can be downloaded from here. For professional developers, there are Professional, Architect, or Enterprise version.

Oh hi there 👋
It’s nice to meet you.

Sign up to receive awesome C++ content in your inbox, every day.

We don’t spam! Read our privacy policy for more info.

About author

Dr. Yilmaz Yoru has 35+ years of coding with more than 30+ programming languages, mostly C++ on Windows, Android, Mac-OS, iOS, Linux, and some other operating systems. He graduated and received his MSc and PhD degrees from the Department of Mechanical Engineering of Eskisehir Osmangazi University. He is the founder and CEO of ESENJA LLC Company. His interests are Programming, Thermodynamics, Fluid Mechanics, Artificial Intelligence, 2D & 3D Designs, and high-end innovations.
Related posts
C++C++17Code SnippetGame DevelopmentLanguage FeatureLearn C++

What Is Skia In Modern C++?

C++C++17Learn C++

How To Use Skia in C++ Builder 12?

C++C++17C++20Introduction to C++Language FeatureLearn C++Syntax

Learn How To Use Clamp (std::clamp) In Modern C++ 17 and Beyond

C++C++11C++14C++17C++20Learn C++

What Is The Priority Queue (std::priority_queue) In Modern C++?