Wak*_*zil 5 c++ memory multithreading c++11
在41.2.1 Memory Location他的新书中,B.Stroustrup写了以下内容:
考虑两个全局变量b和c:
Run Code Online (Sandbox Code Playgroud)// thread1 char c = 0; void f() { c = 1; int x = c; } // thread2 char b = 0; void g() { b = 1; int y = b; }现在,x == 1和y == 1,正如任何人所期望的那样.为什么这甚至值得说?考虑如果链接器在内存中的同一个字中分配c和b并且(像大多数现代硬件一样)机器无法加载或存储小于单词的任何内容,可能会发生 什么:
如果没有定义明确且合理的内存模型,线程1可能会读取包含b和c的单词,更改c,并将单词写回内存.同时线程2可以用b做同样的事情.然后,无论哪个线程设法首先读取该单词,哪个线程设法将其结果写回内存最后将确定结果.我们可能会得到10,01,或11 (而不是00).记忆模型使我们免于混乱; 我们得到 11.00不能发生的原因是在任一线程启动之前(由编译器或链接器)完成b和c的初始化.
假设这句话:
我们可能会得到10,01,或11(而不是00)
分别指变量x和y的最终值,如果没有合理的记忆模型,我们怎么能得到10和01.我只是看不出这是怎么可能的.
我也无法理解作者在撰写上述最后一句时的意思:
00不能发生的原因是在任一线程启动之前(由编译器或链接器)完成b和c的初始化 .
你可以在没有合理内存模型的情况下获得01或10的原因是因为线程操作同时发生并且内存的读写不是原子的.它们需要两个步骤 - 步骤1:读取,步骤2:写入.如果没有合理的内存模型,可能会出现以下情况:
线程1:读取00内存:00
线程2:读取00内存:00
线程1:写入10个内存:10
线程2:写入01内存:01
结果:01
多线程编程时,多线程访问相同资源的问题很常见.例如,需要访问相同静态成员变量的多个线程.我们防止线程跨越彼此的方式是使用互斥锁和关键部分.但是,在提供的情况下,我们不需要这样做,因为内存模型为我们处理它(是明智的).
00这是不可能的原因:在任一线程启动之前内存被初始化为00,因此两个线程都不会践踏其他线程所做的事情,并将内存设置为00.