|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
(C++20) | ||||
(C++20) | ||||
(C++20) | ||||
| Constants | ||||
(C++17) | ||||
| Specialized member functions | ||||
| Specialized for integral, floating-point(C++20) and pointer types | ||||
| Specialized for integral and pointer types only | ||||
(C++26) | ||||
(C++26) | ||||
atomic::operator++atomic::operator++(int)atomic::operator--atomic::operator--(int) | ||||
| Specialized for integral types only | ||||
member only of atomic<Integral > specializations | ||
T operator++()noexcept; | (1) | (since C++11) |
T operator++()volatilenoexcept; | (2) | (since C++11) |
T operator++(int)noexcept; | (3) | (since C++11) |
T operator++(int)volatilenoexcept; | (4) | (since C++11) |
T operator--()noexcept; | (5) | (since C++11) |
T operator--()volatilenoexcept; | (6) | (since C++11) |
T operator--(int)noexcept; | (7) | (since C++11) |
T operator--(int)volatilenoexcept; | (8) | (since C++11) |
member only of atomic<T*> partial specialization | ||
T* operator++()noexcept; | (9) | (since C++11) |
T* operator++()volatilenoexcept; | (10) | (since C++11) |
T* operator++(int)noexcept; | (11) | (since C++11) |
T* operator++(int)volatilenoexcept; | (12) | (since C++11) |
T* operator--()noexcept; | (13) | (since C++11) |
T* operator--()volatilenoexcept; | (14) | (since C++11) |
T* operator--(int)noexcept; | (15) | (since C++11) |
T* operator--(int)volatilenoexcept; | (16) | (since C++11) |
Atomically increments or decrements the current value. The operation is read-modify-write operation.
T is not a complete object type, the program is ill-formed.It is deprecated ifstd::atomic<T>::is_always_lock_free is false and anyvolatile overload participates in overload resolution. | (since C++20) |
Contents |
operator++() andoperator--() return the value of the atomic variable after the modification. Formally, the result of incrementing/decrementing the value immediately preceding the effects of this function in themodification order of*this.
operator++(int) andoperator--(int) return the value of the atomic variable before the modification. Formally, the value immediately preceding the effects of this function in themodification order of*this.
Unlike most pre-increment and pre-decrement operators, the pre-increment and pre-decrement operators for atomic types do not return a reference to the modified object. They return a copy of the stored value instead.
#include <atomic>#include <chrono>#include <iomanip>#include <iostream>#include <mutex>#include <random>#include <string>#include <thread> std::atomic<int> atomic_count{0}; std::mutex cout_mutex;int completed_writes{0}; constexprint global_max_count{72};constexprint writes_per_line{8};constexprint max_delay{100}; template<int Max>int random_value(){staticstd::uniform_int_distribution<int> distr{1, Max};staticstd::random_device engine;staticstd::mt19937 noise{engine()};staticstd::mutex rand_mutex;std::lock_guard lock{rand_mutex};return distr(noise);} int main(){auto work=[](conststd::string id){for(int count{};(count=++atomic_count)<= global_max_count;){std::this_thread::sleep_for(std::chrono::milliseconds(random_value<max_delay>())); // print thread `id` and `count` value{std::lock_guard lock{cout_mutex}; constbool new_line=++completed_writes% writes_per_line==0; std::cout<< id<<std::setw(3)<< count<<" "<<(new_line?"\n":"")<<std::flush;}}}; std::jthread j1(work,"░"), j2(work,"▒"), j3(work,"▓"), j4(work,"█");}
Possible output:
▒ 2 ░ 1 ▒ 5 ▒ 7 █ 4 ░ 6 ▓ 3 ▒ 8 ▓ 11 █ 9 ▓ 13 ░ 10 █ 14 ▒ 12 ░ 16 ░ 19 ▓ 15 ▒ 18 ▓ 21 ▒ 22 █ 17 █ 25 ▒ 24 █ 26 ░ 20 ░ 29 ▒ 27 ▓ 23 ▒ 31 ▒ 33 ▓ 32 █ 28 ░ 30 ░ 37 ▒ 34 ▓ 35 █ 36 █ 41 ▓ 40 ▒ 39 ░ 38 ▓ 43 █ 42 ▓ 46 ▓ 48 █ 47 █ 50 ░ 45 ▒ 44 ▒ 53 ▒ 54 ▓ 49 ▒ 55 █ 51 ▒ 57 █ 58 ░ 52 ▓ 56 ░ 61 ▒ 59 █ 60 ▓ 62 ▒ 64 ░ 63 ░ 68 ▓ 66 █ 65 █ 71 ▒ 67 ▓ 70 ░ 69 █ 72
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P0558R1 | C++11 | arithmetic permitted on pointers to (possibly cv-qualified)void or function | made ill-formed |
| 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] | |
| performs bitwise AND, OR, XOR with the atomic value (public member function)[edit] |