需要帮助理解从B.Stroustrup的新书中提取的本文

Wak*_*zil 5 c++ memory multithreading c++11

41.2.1 Memory Location他的新书中,B.Stroustrup写了以下内容:

考虑两个全局变量bc:

// thread1
char c = 0;
void f()
{
   c = 1;
   int x = c;
} 

// thread2
char b = 0;
void g()
{
   b = 1;
   int y = b;
}
Run Code Online (Sandbox Code Playgroud)

现在,x == 1和y == 1,正如任何人所期望的那样.为什么这甚至值得说?考虑如果链接器在内存中的同一个字中分配cb并且(像大多数现代硬件一样)机器无法加载或存储小于单词的任何内容,可能会发生 什么:

在此输入图像描述

如果没有定义明确且合理的内存模型,线程1可能会读取包含bc的单词,更改c,并将单词写回内存.同时线程2可以用b做同样的事情.然后,无论哪个线程设法首先读取该单词,哪个线程设法将其结果写回内存最后将确定结果.我们可能会得到10,01,或11 (而不是00).记忆模型使我们免于混乱; 我们得到 11.00不能发生的原因是在任一线程启动之前(由编译器或链接器)完成bc的初始化.

假设这句话:

我们可能会得到10,01,或11(而不是00)

分别指变量xy的最终值,如果没有合理的记忆模型,我们怎么能得到1001.我只是看不出这是怎么可能的.

我也无法理解作者在撰写上述最后一句时的意思:

00不能发生的原因是在任一线程启动之前(由编译器或链接器)完成bc的初始化 .

aca*_*lon 5

你可以在没有合理内存模型的情况下获得01或10的原因是因为线程操作同时发生并且内存的读写不是原子的.它们需要两个步骤 - 步骤1:读取,步骤2:写入.如果没有合理的内存模型,可能会出现以下情况:

线程1:读取00内存:00

线程2:读取00内存:00

线程1:写入10个内存:10

线程2:写入01内存:01

结果:01

多线程编程时,多线程访问相同资源的问题很常见.例如,需要访问相同静态成员变量的多个线程.我们防止线程跨越彼此的方式是使用互斥锁和关键部分.但是,在提供的情况下,我们不需要这样做,因为内存模型为我们处理它(是明智的).

00这是不可能的原因:在任一线程启动之前内存被初始化为00,因此两个线程都不会践踏其他线程所做的事情,并将内存设置为00.