Atomic variables are named as such because they cannot be read or written partially. Compare, for example, the Point and int data types:
struct Point {
int x, y;
};
Point p{0, 0};
int b = 0;
p = {10, 10};
b = 10;
In this example, modification of the p variable is equivalent to two assignments:
p.x = 10;
p.y = 10;
This means that any concurrent thread reading the p variable can get partially modified data, such as x=10, y=0, which can lead to incorrect calculations that are hard to detect and hard to reproduce. That is why access to such data types should be synchronized.
How about the b variable? Can it be modified partially? The answer is: yes, depending on the platform. However, C++ provides a set of data types and templates to ensure that a variable changes all at once, as a whole, atomically.
In this recipe, we will learn how...