The definition of atomic is hazy; a value that is atomic in one application could be non-atomic in another. For a general guideline, a value is non-atomic if the application deals with only a part of the value. Eg: The current Wikipedia article on First NF (Normal Form) section Atomicity actually quotes from the introductory parts above.
why would the cache coherence be any different if the memory is shared? what I need is a way to get the memory synced across cores for a particular address. If C++ dosent support it, does anyone know what asm instructions I can use? I read that on x86, the update would be atomic anyway so I guess that's resolved.
The difference is that a normal load/store is not guaranteed to be tear-free, whereas a relaxed atomic read/write is. Also, the atomic guarantees that the compiler doesn't rearrange or optimise-out memory accesses in a similar fashion to what volatile guarantees. (Pre-C++11, volatile was an essential part of rolling your own atomics. But now it's obsolete for that purpose. It does still work ...
22 Atomic vs. Non-Atomic Operations "An operation acting on shared memory is atomic if it completes in a single step relative to other threads. When an atomic store is performed on a shared memory, no other thread can observe the modification half-complete.
Objects of atomic types are the only C++ objects that are free from data races; that is, if one thread writes to an atomic object while another thread reads from it, the behavior is well-defined. In addition, accesses to atomic objects may establish inter-thread synchronization and order non-atomic memory accesses as specified by std::memory_order.