#ifndef HGL_THREAD_ATOMIC_GNU_INCLUDE #define HGL_THREAD_ATOMIC_GNU_INCLUDE namespace hgl { template class atom { volatile T value; public: atom(){value=0;} atom(const volatile T new_value){operator=(new_value);} inline T operator ->(){return value;} inline T operator *= (const volatile T v) {return operator=(value *=v);} inline T operator /= (const volatile T v) {return operator=(value /=v);} inline T operator %= (const volatile T v) {return operator=(value %=v);} inline T operator >>= (const volatile T v) {return operator=(value>>=v);} inline T operator <<= (const volatile T v) {return operator=(value<<=v);} inline T operator ! ()const {return !value;} inline T operator ~ ()const {return ~value;} inline operator T () {return value;} inline operator const T ()const {return value;} inline bool operator ! () {return !value;} inline bool operator == (const volatile T v)const {return value==v;} inline bool operator != (const volatile T v)const {return value!=v;} inline T operator = (const volatile T new_value) {__sync_lock_test_and_set(&value,new_value); return value;} inline T operator += (const volatile T add_value) {return __sync_add_and_fetch(&value,add_value);} inline T operator -= (const volatile T sub_value) {return __sync_sub_and_fetch(&value,sub_value);} inline T operator &= (const volatile T v) {return __sync_and_and_fetch(&value,v);} inline T operator |= (const volatile T v) {return __sync_or_and_fetch (&value,v);} inline T operator ^= (const volatile T v) {return __sync_xor_and_fetch(&value,v);} inline T operator ++ () {return __sync_add_and_fetch(&value,1);} //前置++ inline T operator ++ (int) {return __sync_fetch_and_add(&value,1);} //后置++ inline T operator -- () {return __sync_sub_and_fetch(&value,1);} inline T operator -- (int) {return __sync_fetch_and_sub(&value,1);} };//template class atom }//namespace hgl #endif//HGL_THREAD_ATOMIC_GNU_INCLUDE