Skip to content

Commit 5c50dbc

Browse files
book: avoid implication that volatile may be usable in concurrency (#281)
1 parent 54e99e1 commit 5c50dbc

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

book/en-us/07-thread.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ We simply can't expect multiple consumers to be able to produce content in a par
228228
## 7.5 Atomic Operation and Memory Model
229229

230230
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.
231-
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.
231+
For example, the compiler may have optimizations for the variable `notified`, such as the value of a register.
232232
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?
233233

234234
```cpp

book/zh-cn/07-thread.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ int main() {
232232
## 7.5 原子操作与内存模型
233233

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

@@ -242,7 +242,7 @@ int main() {
242242

243243
int main() {
244244
int a = 0;
245-
int flag = 0;
245+
volatile int flag = 0;
246246

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

0 commit comments

Comments
 (0)