A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://en.cppreference.com/w/cpp/language/../atomic/atomic.html below:

std::atomic - cppreference.com

template< class T >
struct atomic;

(1) (since C++11)

template< class U >
struct atomic<U*>;

(2) (since C++11) (3) (since C++20) (4) (since C++20)

#define _Atomic(T) /* see below */

(5) (since C++23)

Each instantiation and full specialization of the std::atomic template defines an atomic type. If one thread writes to an atomic object while another thread reads from it, the behavior is well-defined (see memory model for details on data races).

In addition, accesses to atomic objects may establish inter-thread synchronization and order non-atomic memory accesses as specified by std::memory_order.

std::atomic is neither copyable nor movable.

The compatibility macro _Atomic is provided in <stdatomic.h> such that _Atomic(T) is identical to std::atomic<T> while both are well-formed.

It is unspecified whether any declaration in namespace std is available when <stdatomic.h> is included.

(since C++23) [edit] Specializations [edit] Primary template

The primary std::atomic template may be instantiated with any TriviallyCopyable type T satisfying both CopyConstructible and CopyAssignable. The program is ill-formed if any of following values is false:

struct Counters { int a; int b; }; // user-defined trivially-copyable type
std::atomic<Counters> cnt;         // specialization for the user-defined type

std::atomic<bool> uses the primary template. It is guaranteed to be a standard layout struct and has a trivial destructor.

[edit] Partial specializations

The standard library provides partial specializations of the std::atomic template for the following types with additional properties that the primary template does not have:

2)

Partial specializations

std::atomic<U*>

for all pointer types. These specializations have standard layout

, trivial default constructors,(until C++20)

and trivial destructors. Besides the operations provided for all atomic types, these specializations additionally support atomic arithmetic operations appropriate to pointer types, such as

fetch_add

,

fetch_sub

.

[edit] Specializations for integral types

When instantiated with one of the following integral types, std::atomic provides additional atomic operations appropriate to integral types such as fetch_add, fetch_sub, fetch_and, fetch_or, fetch_xor:

Additionally, the resulting std::atomic<Integral> specialization has standard layout, a trivial default constructor,(until C++20) and a trivial destructor. Signed integer arithmetic is defined to use two's complement; there are no undefined results.

Specializations for floating-point types

When instantiated with one of the cv-unqualified floating-point types (float, double, long double and cv-unqualified extended floating-point types(since C++23)), std::atomic provides additional atomic operations appropriate to floating-point types such as fetch_add and fetch_sub.

Additionally, the resulting std::atomic<Floating> specialization has standard layout and a trivial destructor.

No operations result in undefined behavior even if the result is not representable in the floating-point type. The floating-point environment in effect may be different from the calling thread's floating-point environment.

(since C++20) [edit] Member types Type Definition value_type T (regardless of whether specialized or not) difference_type[1]

value_type (only for atomic<Integral> and atomic<Floating>(since C++20) specializations)

std::ptrdiff_t (only for std::atomic<U*> specializations)

  1. ↑ difference_type is not defined in the primary std::atomic template or in the partial specializations for std::shared_ptr and std::weak_ptr.
[edit] Member functions constructs an atomic object
(public member function) [edit] stores a value into an atomic object
(public member function) [edit] checks if the atomic object is lock-free
(public member function) [edit] atomically replaces the value of the atomic object with a non-atomic argument
(public member function) [edit] atomically obtains the value of the atomic object
(public member function) [edit] loads a value from an atomic object
(public member function) [edit] atomically replaces the value of the atomic object and obtains the value held previously
(public member function) [edit] atomically compares the value of the atomic object with non-atomic argument and performs atomic exchange if equal or atomic load if not
(public member function) [edit] blocks the thread until notified and the atomic value changes
(public member function) [edit] notifies at least one thread waiting on the atomic object
(public member function) [edit] notifies all threads blocked waiting on the atomic object
(public member function) [edit] Constants indicates that the type is always lock-free
(public static member constant) [edit] [edit] Specialized member functions Specialized for integral, floating-point(since C++20) and pointer types atomically adds the argument to the value stored in the atomic object and obtains the value held previously
(public member function) [edit] atomically subtracts the argument from the value stored in the atomic object and obtains the value held previously
(public member function) [edit] adds to or subtracts from the atomic value
(public member function) [edit] Specialized for integral and pointer types only atomically performs std::max between the argument and the value of the atomic object and obtains the value held previously
(public member function) [edit] atomically performs std::min between the argument and the value of the atomic object and obtains the value held previously
(public member function) [edit] increments or decrements the atomic value by one
(public member function) [edit] Specialized for integral types only atomically performs bitwise AND between the argument and the value of the atomic object and obtains the value held previously
(public member function) [edit] atomically performs bitwise OR between the argument and the value of the atomic object and obtains the value held previously
(public member function) [edit] atomically performs bitwise XOR between the argument and the value of the atomic object and obtains the value held previously
(public member function) [edit] performs bitwise AND, OR, XOR with the atomic value
(public member function) [edit] [edit] Type aliases

Type aliases are provided for bool and all integral types listed above, as follows:

Note:

std::atomic_intN_t

,

std::atomic_uintN_t

,

std::atomic_intptr_t

, and

std::atomic_uintptr_t

are defined if and only if

std::intN_t

,

std::uintN_t

,

std::intptr_t

, and

std::uintptr_t

are defined, respectively.

std::atomic_signed_lock_free and std::atomic_unsigned_lock_free are optional in freestanding implementations.

(since C++20) [edit] Notes

There are non-member function template equivalents for all member functions of std::atomic. Those non-member functions may be additionally overloaded for types that are not specializations of std::atomic, but are able to guarantee atomicity. The only such type in the standard library is std::shared_ptr<U>.

_Atomic is a keyword and used to provide atomic types in C.

Implementations are recommended to ensure that the representation of _Atomic(T) in C is same as that of std::atomic<T> in C++ for every possible type T. The mechanisms used to ensure atomicity and memory ordering should be compatible.

On GCC and Clang, some of the functionality described here requires linking against -latomic.

[edit] Example
#include <atomic>
#include <iostream>
#include <thread>
#include <vector>
 
std::atomic_int acnt;
int cnt;
 
void f()
{
    for (auto n{10000}; n; --n)
    {
        ++acnt;
        ++cnt;
        // Note: for this example, relaxed memory order is sufficient,
        // e.g. acnt.fetch_add(1, std::memory_order_relaxed);
    }
}
 
int main()
{
    {
        std::vector<std::jthread> pool;
        for (int n = 0; n < 10; ++n)
            pool.emplace_back(f);
    }
 
    std::cout << "The atomic counter is " << acnt << '\n'
              << "The non-atomic counter is " << cnt << '\n';
}

Possible output:

The atomic counter is 100000
The non-atomic counter is 69696
[edit] Defect reports

The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

DR Applied to Behavior as published Correct behavior LWG 2441 C++11 typedefs for atomic versions of optional
fixed width integer types were missing added LWG 3012 C++11 std::atomic<T> was permitted for any T
that is trivially copyable but not copyable such specializations are forbidden LWG 3949 C++17 the wording requiring std::atomic<bool> to have a
trivial destructor was accidently dropped in C++17 added back LWG 4069
(P3323R1) C++11 support for cv-qualified T was questionable disallow T being cv-qualified P0558R1 C++11 template argument deduction for some
functions for atomic types might accidently
fail; invalid pointer operations were provided specification was substantially rewritten:
member typedefs value_type
and difference_type are added [edit] See also

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4