2016-11-13 104 views
1

第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在主线程看到的价值0a和价值5b,因为这两个动作:a=3;b=5;可以乱序执行,即使a=3;b=5;执行。从主线程的角度来看,可能还是会看到b的值5,因为上面提到的潮红问题而没有看到值3的a

那么,我应该相信哪个答案?测验的解释是错误的?它是特定于java的吗?

+0

为什么测验对自己*自己*并发模型的解释错了?由于它使用伪代码,所以它认为它不会考虑在实践中遇到的那种硬件重新排序。这不是一种不合理的方法,因为这些东西在添加顺序执行模型的硬件缓解之前足够困难。假设'async'模块以完全内存屏障执行,并且'* = a + b'只在*两个模块以未指定的顺序执行后执行*,然后'x = 0 + 5'确实不可能。 –

回答

1

那么,我应该相信哪个答案?测验的解释是错误的?它是特定于java的吗?

根据我可以看到的上下文,测验答案和解释是自洽的。它使用/描述了一个与Java不同的并发模型。

来自的引用Goetz等人对于Java是正确的,但此示例代码不是用Java编写的。


1 - 该链接只能由注册该课程的人员阅读。