49 lines
2.6 KiB
C++
49 lines
2.6 KiB
C++
#ifndef HGL_THREAD_ATOMIC_GNU_INCLUDE
|
|
#define HGL_THREAD_ATOMIC_GNU_INCLUDE
|
|
|
|
namespace hgl
|
|
{
|
|
template<typename T> 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<typename T> class atom
|
|
}//namespace hgl
|
|
#endif//HGL_THREAD_ATOMIC_GNU_INCLUDE
|