Can you read the value of std::atomic_flag without modifying it?
atomic, c++, c++11, multithreading
Solution
You cannot read the value of a `std::atomic_flag` without setting it to `true`. This is by design. It is not a boolean variable (we have `std::atomic<bool>` for that), but a minimal flag that is guaranteed lock free on all architectures that support C++11.
On some platforms the only atomic instructions are exchange instructions. On such platforms, `std::atomic_flag::test_and_set()` can be implemented with `exchange var,1` and `clear()` with `exchange var,0`, but there is no atomic instruction for reading the value.
So, if you want to read the value without changing it, then you need `std::atomic<bool>`.
Problem
I am using C++ `std::atomic_flag` as an atomic Boolean flag. Setting the flag to true or false is not a problem but how do I query the current state of flag without setting it to some value? I know that there are member functions '`atomic_flag_clear`' and '`atomic_flag_set`'. They do give back the previous state but also modify the current state. Is there any way to query flag state without modifying it or do I have to use full fledged '`std::atomic<bool>`'.