Skip to content

Commit

Permalink
book: avoid implication that volatile may be usable in concurrency (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
frederick-vs-ja committed May 20, 2024
1 parent 54e99e1 commit 5c50dbc
Show file tree
Hide file tree
Showing 2 changed files with 3 additions and 3 deletions.
2 changes: 1 addition & 1 deletion book/en-us/07-thread.md
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ We simply can't expect multiple consumers to be able to produce content in a par
## 7.5 Atomic Operation and Memory Model

Careful readers may be tempted by the fact that the example of the producer-consumer model in the previous section may have compiler optimizations that cause program errors.
For example, the boolean `notified` is not modified by `volatile`, and the compiler may have optimizations for this variable, such as the value of a register.
For example, the compiler may have optimizations for the variable `notified`, such as the value of a register.
As a result, the consumer thread can never observe the change of this value. This is a good question. To explain this problem, we need to further discuss the concept of the memory model introduced from C++11. Let's first look at a question. What is the output of the following code?

```cpp
Expand Down
4 changes: 2 additions & 2 deletions book/zh-cn/07-thread.md
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ int main() {
## 7.5 原子操作与内存模型

细心的读者可能会对前一小节中生产者消费者模型的例子可能存在编译器优化导致程序出错的情况产生疑惑。
例如,布尔值 `notified` 没有被 `volatile` 修饰,编译器可能对此变量存在优化,例如将其作为一个寄存器的值,
例如,编译器可能对变量 `notified` 存在优化,例如将其作为一个寄存器的值,
从而导致消费者线程永远无法观察到此值的变化。这是一个好问题,为了解释清楚这个问题,我们需要进一步讨论
从 C++ 11 起引入的内存模型这一概念。我们首先来看一个问题,下面这段代码输出结果是多少?

Expand All @@ -242,7 +242,7 @@ int main() {

int main() {
int a = 0;
int flag = 0;
volatile int flag = 0;

std::thread t1([&]() {
while (flag != 1);
Expand Down

0 comments on commit 5c50dbc

Please sign in to comment.