From C++ Concurrency in Action:
difference between std::atomic and std::atomic_flag is that std::atomic may not be lock-free; the implementation may have to acquire a mutex internally in order to ensure the atomicity of the operations
I wonder why. If atomic_flag is guaranteed to be lock-free, why isn't it guaranteed for atomic<bool>
as well?
Is this because of the member function compare_exchange_weak
? I know that some machines lack a single compare-and-exchange instruction, is that the reason?
std::atomic<T>
has a type argument, std::atomic_flag does not. Whether T updates are atomic depends on the processor architecture. The library writer can pick any suitable type for atomic_flag. – Endothermicstd::atomic<bool>
andstd::atomic_flag
– Rostand