# std::atomic_flag

From cppreference.com
< cpp‎ | atomic

Defined in header `<atomic>` |  |
class atomic_flag; |  | (since C++11)

std::atomic_flag is an atomic boolean type. Unlike all specializations 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 previous value (public member function)

### Example

A spinlock mutex can be implemented in userspace using an atomic_flag

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 < 100; ++cnt) {
            while (lock.test_and_set(std::memory_order_acquire))  // acquire lock
                 ; // spin
            std::cout << "Output from thread " << n << '\n';
            lock.clear(std::memory_order_release);               // release 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();
        }
    }

Output:

    Output from thread 2
    Output from thread 6
    Output from thread 7
    ...<exactly 1000 lines>...

### See also

atomic_flag_test_and_set atomic_flag_test_and_set_explicit (C++11)(C++11) | atomically sets the flag to true and returns its previous value (function)
atomic_flag_clear atomic_flag_clear_explicit (C++11)(C++11) | atomically sets the value of the flag to false (function)
ATOMIC_FLAG_INIT (C++11) | initializes an std::atomic_flag to false (macro constant)
C documentation for atomic_flag

Retrieved from "http://en.cppreference.com/mwiki/index.php?title=cpp/atomic/atomic_flag&oldid=62670"