第1部分:多线程与乱序执行的
下面是从一个测验上edx RiceX: COMP322 Fundamentals of Parallel Programming/Topic 1.1 Quiz一个问题:
3.Consider以下伪代码程序。
a = b = 0
async {
a = 3;
b = 5;
}
async {
a = 4;
b = 4;
}
x = a + b
在结束时,X可具有各种不同的值。 x有多少个不同的 值?
有一个在解释一个语句:
由于每个异步内的代码执行顺序,这是 不可能得到的总和X = 0 + 5 = 5
第2部分:
以下是有关类似问题的书Java Concurrency in Practice
的引用:
在每个线程中的操作都没有数据流相互依赖,因此可以执行不按顺序。 (即使它们是按顺序执行 ,通过该高速缓存刷新到主 存储器中的定时可以使其显示,从B的角度来看,在A中的 分配发生在相反的顺序。
根据上述说法,我认为这是可能的x=a+b
在主线程看到的价值0
a
和价值5
b
,因为这两个动作:a=3;
和b=5;
可以乱序执行,即使a=3;
和b=5;
执行。从主线程的角度来看,可能还是会看到b
的值5,因为上面提到的潮红问题而没有看到值3的a
。
那么,我应该相信哪个答案?测验的解释是错误的?它是特定于java的吗?
为什么测验对自己*自己*并发模型的解释错了?由于它使用伪代码,所以它认为它不会考虑在实践中遇到的那种硬件重新排序。这不是一种不合理的方法,因为这些东西在添加顺序执行模型的硬件缓解之前足够困难。假设'async'模块以完全内存屏障执行,并且'* = a + b'只在*两个模块以未指定的顺序执行后执行*,然后'x = 0 + 5'确实不可能。 –