FreeBSD Manual Pages
std::atomic_flag(3) C++ Standard Libary std::atomic_flag(3) NAME std::atomic_flag - std::atomic_flag Synopsis Defined in header <atomic> class atomic_flag; (since C++11) std::atomic_flag is an atomic boolean type. Unlike all specializa- tions of std::atomic, it is guaranteed to be lock-free. Unlike std::atomic<bool>, std::atomic_flag does not provide load or store operations. Member functions constructor constructs an atomic_flag (public member function) operator= the assignment operator (public member function) clear atomically sets flag to false (public member function) test_and_set atomically sets the flag to true and obtains its pre- vious value (public member function) test atomically returns the value of the flag (C++20) (public member function) wait blocks the thread until notified and the atomic value changes (C++20) (public member function) notify_one notifies at least one thread waiting on the atomic ob- ject (C++20) (public member function) notify_all notifies all threads blocked waiting on the atomic ob- ject (C++20) (public member function) Example A spinlock mutex demo can be implemented in userspace using an atomic_flag. Do note that spinlock mutexes are extremely dubious in practice. // Run this code #include <thread> #include <vector> #include <iostream> #include <atomic> std::atomic_flag lock = ATOMIC_FLAG_INIT; void f(int n) { for (int cnt = 0; cnt < 40; ++cnt) { while (lock.test_and_set(std::memory_order_acquire)) { // ac- quire lock // Since C++20, it is possible to update atomic_flag's // value only when there is a chance to acquire the lock. // See also: https://stackoverflow.com/questions/62318642 #if defined(__cpp_lib_atomic_flag_test) while (lock.test(std::memory_order_relaxed)) // test lock #endif ; // spin } static int out{}; std::cout << n << ((++out % 40) == 0 ? '\n' : ' '); lock.clear(std::memory_order_release); // re- lease lock } } int main() { std::vector<std::thread> v; for (int n = 0; n < 10; ++n) { v.emplace_back(f, n); } for (auto& t : v) { t.join(); } } Possible output: 0 1 1 2 0 1 3 2 3 2 0 1 2 3 2 3 0 1 3 2 0 1 2 3 2 3 0 3 2 3 2 3 2 3 1 2 3 0 1 3 2 3 2 0 1 2 3 0 1 2 3 2 0 1 2 3 0 1 2 3 2 3 2 3 2 0 1 2 3 2 3 0 1 3 2 3 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 3 2 0 2 3 2 3 2 3 2 3 2 3 0 3 2 3 0 3 0 3 2 3 0 3 2 3 2 3 0 2 3 0 3 2 0 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 See also atomic_flag_test_and_set atomically sets the flag to true and returns its atomic_flag_test_and_set_explicit previous value (C++11) (function) (C++11) atomic_flag_clear atomic_flag_clear_explicit atomically sets the value of the flag to false (C++11) (function) (C++11) atomic_flag_wait blocks the thread until notified and the flag atomic_flag_wait_explicit changes (C++20) (function) (C++20) atomic_flag_notify_one notifies a thread blocked in atomic_flag_wait (C++20) (function) atomic_flag_notify_all notifies all threads blocked in atomic_flag_wait (C++20) (function) ATOMIC_FLAG_INIT initializes an std::atomic_flag to false (C++11) (macro constant) http://cppreference.com 2022.07.31 std::atomic_flag(3)
NAME | Synopsis | Member functions | Example | Possible output: | See also
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=std::atomic_flag&sektion=3&manpath=FreeBSD+Ports+15.0>
