当相等时,两个并行递增和递减终止

时间:2014-01-30 23:32:49

标签: java scala parallel-processing

假设您有以下两个程序:

var x = 0;
var y = 10;
def P = { while (x != y) x = x + 1; }
def Q = { while (x != y) y = y - 1; }

并行运行。

唯一的原子操作是READ,INCREMENT,DECREMENT,WRITE。

我认为有一种情况是一个进程“跳过”另一个进程(因为你无法控制它们的运行方式)。

以下是一个例子:

  • P和Q READ x = 0,y = 10(最开始)
  • Q快速运行并使y达到0
  • P INCREMENTS和WRITES,现在x是1(因为它仍然认为y是10)
  • 返回Q,READ x为1,y为0
  • Q将y递减到-1
  • 永不终止

为什么不这样?它似乎总是终止。

有人可以解释为什么我的例子不会发生吗?

2 个答案:

答案 0 :(得分:2)

我第一次打算回答这个问题,但它给了我复杂的感觉,因为一方面它不是一个很好的措辞问题:你使用什么并发框架?你确定你做的是正确的 - 它真的是并发的吗?如果没有看到更多代码,我们如何判断。这些关于原子性的假设是什么?你是否在没有真正并发的某种VM上的单个线程上运行它?我怎么知道这一切?你真的只跑到10岁吗?我还在乎吗?我应该关心吗? ...

......但是我应该指出这一点:

这个循环终止了吗?:

var x = 1; while(x>0){ x = x + 1 }

或类似的问题 - Int.MaxValue + 1的价值是什么?

这是你问题的部分答案......我不太关心的另一部分;)

答案 1 :(得分:0)

我一般都喜欢你的问题,但你必须提供真实的源代码,以便我们可以提供帮助。一个可能的答案是优化。 P循环中的y值可以在处理器寄存器中“缓存”,而不必包含内存中的当前值。

在Java中,您可以使用volatile关键字解决此问题: http://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

在Scala中有一个不稳定的注释: http://www.scala-lang.org/old/node/7952.html

尝试将println(y)添加到P循环中,以便查看y的值是否(以及如何)更改。继续努力。