2.4.3.1.3. C++ Atomic Operations
template<typename T> struct atomic
{
  public:

    bool is_lock_free () { ... }

    T operator= (T i) { store (i); return (i); }
    void store (T i, memory_order m = memory_order_seq_cst) { ... }
    T load (memory_order m = memory_order_seq_cst) { ... }

    T operator++ () { ... }
    T operator-- () { ... }
    T fetch_add (T i, memory_order m = memory_order_seq_cst) { ... }
    T fetch_sub (T i, memory_order m = memory_order_seq_cst) { ... }

    T exchange (T i, memory_order m = memory_order_seq_cst) { ... }
    bool compare_exchange_weak (T& e, T i, memory_order succ, memory_order fail) { ... }
    bool compare_exchange_strong (T& e, T i, memory_order succ, memory_order fail) { ... }

    ...
}

enum memory_order
{
  memory_order_relaxed, // No ordering constraints
  memory_order_consume, // Load will be consume operation (no reordering of dependent data accesses)
  memory_order_acquire, // Load will be acquire operation (no reordering of arbitrary data accesses)
  memory_order_release, // Store will be release operation
  memory_order_acq_rel, // Load-modify-store will be acquire and release operation
  memory_order_seq_cst  // Any operation will be totally ordered acquire and release operation
};