Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ atomic_flag query state

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 to query the current state of flag without setting it to some value? I know that there are methods '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>'.

like image 368
polapts Avatar asked Jun 19 '12 11:06

polapts


3 Answers

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>.

like image 116
Anthony Williams Avatar answered Nov 12 '22 14:11

Anthony Williams


If you want to use atomic_flag to determine whether a thread should exit, you can do it like this:

Initialization:

std::atomic_flag keep_running = ATOMIC_FLAG_INIT;
keep_running.test_and_set();

Thread loop:

while (keep_running.test_and_set()) {
    // do thread stuff
}

When you want the thread to exit:

keep_running.clear();
like image 25
andrewrk Avatar answered Nov 12 '22 12:11

andrewrk


With C++20 we got the test() method, which does exactly what OP wants.

like image 5
pogojotz Avatar answered Nov 12 '22 14:11

pogojotz