How to perform basic operations with std::atomic when the type is not Integral? How to perform basic operations with std::atomic when the type is not Integral? multithreading multithreading

How to perform basic operations with std::atomic when the type is not Integral?


As a rule, the C++ standard library tries to provide only operations that can be implemented efficiently. For std::atomic, that means operations that can be performed lock-free in an instruction or two on "common" architectures. "Common" architectures have atomic fetch-and-add instructions for integers, but not for floating point types.

If you want to implement math operations for atomic floating point types, you'll have to do so yourself with a CAS (compare and swap) loop (Live at Coliru):

std::atomic<double> foo{0};void add_to_foo(double bar) {  auto current = foo.load();  while (!foo.compare_exchange_weak(current, current + bar))    ;}


So use the integral atomic as a memory barrier. Here's a page with source and explanation: http://preshing.com/20121019/this-is-why-they-call-it-a-weakly-ordered-cpu/