#include <iostream> // std::cout
#include <atomic> // std::atomic, std::memory_order_relaxed
#include <thread> // std::thread
std::atomic<int> foo (0);
void set_foo(int x) {
foo.store(x,std::memory_order_relaxed); // set value atomically
}
void print_foo() {
int x;
do {
x = foo.load(std::memory_order_relaxed); // get value atomically
} while (x==0);
std::cout << "foo: " << x << '\n';
}
int main ()
{
std::thread first (print_foo);
std::thread second (set_foo,10);
first.join();
second.join();
return 0;
}
First thread calls print_foo(). It allocates int x in it's stack frame (variable 1). Then it waits for x != 0.
Second thread calls set_foo(). Argument integer 10 (variable 2) pushed into stack frame of set_foo(). Moreover, it's pushed in stack of other frame.
So variable 1 and variable 2 are at different places. set_foo() can't change variable of print_foo().