#ifndef _ATOMIC_H_DEF_ #define _ATOMIC_H_DEF_ #define WR_MEMORDER __ATOMIC_SEQ_CST #define RD_MEMORDER __ATOMIC_SEQ_CST /* Velmi zjednodušené, ale v zásadě funkční. * Asi to bude nutné trochu rozšířit, ale zatím to nebudu komplikovat. * Použity jsou interní funkce gcc (clang), takže to není závislé na * architektuře. * */ template class atomic { volatile T data; public: explicit atomic () noexcept : data( ) {} explicit atomic (const T & v) noexcept : data(v) {} atomic & operator= (volatile T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; } atomic & operator= (const T & v) { __atomic_store_n (& data, v, WR_MEMORDER); return * this; } operator T () const { return __atomic_load_n (& data, RD_MEMORDER); } atomic & operator+= (const T & v) { __atomic_add_fetch (& data, v, WR_MEMORDER); return * this; } atomic & operator-= (const T & v) { __atomic_sub_fetch (& data, v, WR_MEMORDER); return * this; } }; #endif // _ATOMIC_H_DEF_