C++ : std::atomic and volatile bool

后端 未结 3 2092
一向
一向 2020-12-30 02:55

I\'m just reading the C++ concurrency in action book by Anthony Williams. There is this classic example with two threads, one produce data, the other one consumes the data a

3条回答
  •  轮回少年
    2020-12-30 03:18

    The big difference is that this code is correct, while the version with bool instead of atomic has undefined behavior.

    These two lines of code create a race condition (formally, a conflict) because they read from and write to the same variable:

    Reader

    while (!data_ready)
    

    And writer

    data_ready = true;
    

    And a race condition on a normal variable causes undefined behavior, according to the C++11 memory model.

    The rules are found in section 1.10 of the Standard, the most relevant being:

    Two actions are potentially concurrent if

    • they are performed by different threads, or
    • they are unsequenced, and at least one is performed by a signal handler.

    The execution of a program contains a data race if it contains two potentially concurrent conflicting actions, at least one of which is not atomic, and neither happens before the other, except for the special case for signal handlers described below. Any such data race results in undefined behavior.

    You can see that whether the variable is atomic makes a very big difference to this rule.

提交回复
热议问题