just::thread Complete C++ Standard Thread Library by Just Software Solutions

Documentation Home >> Headers >> <atomic> Header >> std::atomic_itype classes

The std::atomic_itype class provides an atomic integral data type for each fundamental integer type, with a comprehensive set of operations.

The following std::atomic_itype classes are provided, with the corresponding integral-types:

Table 1. Atomic types and their corresponding built-in integral types

std::atomic_itype

integral-type

std::atomic_char

char

std::atomic_schar

signed char

std::atomic_uchar

unsigned char

std::atomic_short

short

std::atomic_ushort

unsigned short

std::atomic_int

int

std::atomic_uint

unsigned int

std::atomic_long

long

std::atomic_ulong

unsigned long

std::atomic_llong

long long

std::atomic_ullong

unsigned long long

std::atomic_wchar_t

wchar_t


Microsoft Visual Studio 2008 specific: long long is not available under that name with this compiler. The 64-bit integral type is __int64, with the corresponding unsigned type being unsigned __int64.

Instances of std::atomic_itype are not CopyConstructible or CopyAssignable, as these operations cannot be performed as a single atomic operation.

typedef struct atomic_itype
{
    atomic_itype() = default;
    constexpr atomic_itype(integral-type);
    bool operator=(integral-type) volatile;

    atomic_itype(const atomic_itype&) = delete;
    atomic_itype& operator=(const atomic_itype&) = delete;

    bool is_lock_free() const volatile;
    void store(integral-type,memory_order = memory_order_seq_cst) volatile;
    integral-type load(memory_order = memory_order_seq_cst) const volatile;
    integral-type exchange(integral-type,memory_order = memory_order_seq_cst) volatile;

    bool compare_exchange_strong(integral-type & old_value, integral-type new_value, memory_order order = memory_order_seq_cst) volatile;
    bool compare_exchange_strong(integral-type & old_value, integral-type new_value, memory_order success_order, memory_order failure_order) volatile;
    bool compare_exchange_weak(integral-type & old_value, integral-type new_value, memory_order order = memory_order_seq_cst) volatile;
    bool compare_exchange_weak(integral-type & old_value, integral-type new_value, memory_order success_order, memory_order failure_order) volatile;

    operator integral-type() const volatile;

    integral-type fetch_add(integral-type,memory_order = memory_order_seq_cst) volatile;
    integral-type fetch_sub(integral-type,memory_order = memory_order_seq_cst) volatile;
    integral-type fetch_and(integral-type,memory_order = memory_order_seq_cst) volatile;
    integral-type fetch_or(integral-type,memory_order = memory_order_seq_cst) volatile;
    integral-type fetch_xor(integral-type,memory_order = memory_order_seq_cst) volatile;

    integral-type operator++() volatile;
    integral-type operator++(int) volatile;
    integral-type operator--() volatile;
    integral-type operator--(int) volatile;

    integral-type operator+=(integral-type) volatile;
    integral-type operator-=(integral-type) volatile;
    integral-type operator&=(integral-type) volatile;
    integral-type operator|=(integral-type) volatile;
    integral-type operator^=(integral-type) volatile;

} atomic_itype;

bool atomic_is_lock_free(volatile const atomic_itype*);
integral-type atomic_exchange(volatile atomic_itype*, integral-type);
integral-type atomic_exchange_explicit(volatile atomic_itype*, integral-type, memory_order);
void atomic_store(volatile atomic_itype*, integral-type);
void atomic_store_explicit(volatile atomic_itype*, integral-type, memory_order);
integral-type atomic_load(volatile const atomic_itype*);
integral-type atomic_load_explicit(volatile const atomic_itype*, memory_order);
bool atomic_compare_exchange_strong(volatile atomic_itype*,integral-type * old_value, integral-type new_value);
bool atomic_compare_exchange_strong_explicit(volatile atomic_itype*,integral-type * old_value, integral-type new_value, memory_order success_order, memory_order failure_order);
bool atomic_compare_exchange_weak(volatile atomic_itype*,integral-type * old_value, integral-type new_value);
bool atomic_compare_exchange_weak_explicit(volatile atomic_itype*,integral-type * old_value, integral-type new_value, memory_order success_order, memory_order failure_order);

integral-type atomic_fetch_add(volatile atomic_itype*, integral-type);
integral-type atomic_fetch_add_explicit(volatile atomic_itype*, integral-type, memory_order);
integral-type atomic_fetch_sub(volatile atomic_itype*, integral-type);
integral-type atomic_fetch_sub_explicit(volatile atomic_itype*, integral-type, memory_order);
integral-type atomic_fetch_and(volatile atomic_itype*, integral-type);
integral-type atomic_fetch_and_explicit(volatile atomic_itype*, integral-type, memory_order);
integral-type atomic_fetch_or(volatile atomic_itype*, integral-type);
integral-type atomic_fetch_or_explicit(volatile atomic_itype*, integral-type, memory_order);
integral-type atomic_fetch_xor(volatile atomic_itype*, integral-type);
integral-type atomic_fetch_xor_explicit(volatile atomic_itype*, integral-type, memory_order);

Header

#include <atomic>

See Also