多线程与乱序执行

时间:2016-11-13 22:09:15

标签: multithreading

第1部分:

以下问题来自于edx RiceX: COMP322 Fundamentals of Parallel Programming/Topic 1.1 Quiz的测验:

  

3.考虑以下伪代码程序。

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的引用:

  

每个线程中的操作彼此没有数据流依赖,   因此可以无序执行。 (即使他们是   按顺序执行,缓存刷新为main的时间   从B的角度来看,记忆可以使它出现   A中的任务以相反的顺序发生。

根据上述声明,我认为主线程x=a+b可以看到价值a的{​​{1}}和价值0的{​​{1}}因为两个操作:b5可以不按顺序执行。即使a=3;b=5;按顺序执行,从主线程的角度来看,它仍然可能会看到a=3;的值为5且没有看到b=5;的值为3因为上面提到的潮红问题。

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

1 个答案:

答案 0 :(得分:1)

  

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

根据我可以看到 1 的背景,测验答案和解释是自洽的。它正在使用/描述与Java不同的并发模型。

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

1 - 该链接仅供注册该课程的人阅读。