Skip to content

book: avoid implication that volatile may be usable in concurrency #281

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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