Search code examples
c++c++11atomicstdatomic

Do I have to use atomic<bool> for "exit" bool variable?


I need to set a flag for another thread to exit. That other thread checks the exit flag from time to time. Do I have to use atomic for the flag or just a plain bool is enough and why (with an example of what exactly may go wrong if I use plain bool)?

#include <future>
bool exit = false;
void thread_fn()
{
    while(!exit)
    {
        //do stuff
        if(exit) break;
        //do stuff
    }
}
int main()
{
    auto f = std::async(std::launch::async, thread_fn);
    //do stuff
    exit = true;
    f.get();
}

Solution

  • Do I have to use atomic for “exit” bool variable?

    Yes.

    Either use atomic<bool>, or use manual synchronization through (for instance) an std::mutex. Your program currently contains a data race, with one thread potentially reading a variable while another thread is writing it. This is Undefined Behavior.

    Per Paragraph 1.10/21 of the C++11 Standard:

    The execution of a program contains a data race if it contains two conflicting actions in different threads, at least one of which is not atomic, and neither happens before the other. Any such data race results in undefined behavior.

    The definition of "conflicting" is given in Paragraph 1.10/4:

    Two expression evaluations conflict if one of them modifies a memory location (1.7) and the other one accesses or modifies the same memory location.