18template <
typename T>
class atomic;
41 inline void store(T desired)
noexcept
44 this->_value = desired;
68 this->_value = desired;
83 this->_value = desired;
101 this->_value = desired;
122 const bool is_always_lock_free =
false;
130 inline
bool is_lock_free() const noexcept
132 return this->is_always_lock_free;
135 inline void store(U *desired)
noexcept
138 this->_value = desired;
144 return *this->_value;
147 operator U() noexcept
155 U old = *this->_value;
156 this->_value = desired;
169 if (this->_value !=
nullptr && *this->_value == *
expected)
171 *this->_value = *desired;
180 if (this->_value !=
nullptr && *this->_value == *
expected)
182 *this->_value = *desired;
211 inline void store(
int desired)
noexcept
213 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
219 asm volatile(
"lock add %1, %0" :
"+m"(out),
"+r"(this->_value));
223 operator int() noexcept
230 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
237 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
238 "sete %[success]\n\t"
239 : [success]
"=r"(success),
"=m"(this->_value)
240 : [target]
"m"(this->_value),
241 "a"(
expected), [desired]
"r"(desired)
248 bool success =
false;
251 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
252 "sete %[success]\n\t"
253 : [success]
"=r"(success),
"=m"(this->_value)
254 : [target]
"m"(this->_value),
255 "a"(
expected), [desired]
"r"(desired)
284 inline void store(
char desired)
noexcept
286 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
292 asm volatile(
"lock add %1, %0" :
"+m"(out),
"+r"(this->_value));
296 operator char() noexcept
303 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
310 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
311 "sete %[success]\n\t"
312 : [success]
"=r"(success),
"=m"(this->_value)
313 : [target]
"m"(this->_value),
314 "a"(
expected), [desired]
"r"(desired)
321 bool success =
false;
324 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
325 "sete %[success]\n\t"
326 : [success]
"=r"(success),
"=m"(this->_value)
327 : [target]
"m"(this->_value),
328 "a"(
expected), [desired]
"r"(desired)
357 inline void store(
long desired)
noexcept
359 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
365 asm volatile(
"lock add %1, %0" :
"+m"(out),
"+r"(this->_value));
369 operator long() noexcept
376 asm volatile(
"lock xchg %0, %1" :
"+m"(this->_value),
"+r"(desired));
383 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
384 "sete %[success]\n\t"
385 : [success]
"=r"(success),
"=m"(this->_value)
386 : [target]
"m"(this->_value),
387 "a"(
expected), [desired]
"r"(desired)
394 bool success =
false;
397 asm volatile(
"lock cmpxchg %[desired], %[target]\n\t"
398 "sete %[success]\n\t"
399 : [success]
"=r"(success),
"=m"(this->_value)
400 : [target]
"m"(this->_value),
401 "a"(
expected), [desired]
"r"(desired)
U exchange(U *desired) noexcept
atomic() noexcept=default
bool compare_exchange_strong(const U *expected, U *desired) noexcept
void store(U *desired) noexcept
bool compare_exchange_weak(const U *expected, U *desired) noexcept
Compare and exchange the value of the atomic object.
atomic() noexcept=default
char exchange(char desired) noexcept
bool compare_exchange_weak(char &expected, char desired) noexcept
bool compare_exchange_strong(char &expected, char desired) noexcept
void store(char desired) noexcept
int exchange(int desired) noexcept
bool compare_exchange_strong(int &expected, int desired) noexcept
bool compare_exchange_weak(int &expected, int desired) noexcept
atomic() noexcept=default
void store(int desired) noexcept
long exchange(long desired) noexcept
bool compare_exchange_strong(long &expected, long desired) noexcept
atomic() noexcept=default
void store(long desired) noexcept
bool compare_exchange_weak(long &expected, long desired) noexcept
The atomic class template provides operations on atomic types.
void store(T desired) noexcept
bool compare_exchange_weak(const T &expected, T desired) noexcept
Compare and exchange the value of the atomic object.
T exchange(T desired) noexcept
Exchange the value stored in the atomic object with a new value.
const bool is_always_lock_free
atomic() noexcept=default
bool compare_exchange_strong(const T &expected, T desired) noexcept
Compare and exchange the value of the atomic object.
bool is_lock_free() const noexcept
T value_type
The type of the atomic object.
A simple lock guard implementation.
A simple mutex implementation.