假设您有以下两个程序:
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。
我认为有一种情况是一个进程“跳过”另一个进程(因为你无法控制它们的运行方式)。
以下是一个例子:
为什么不这样?它似乎总是终止。
有人可以解释为什么我的例子不会发生吗?
答案 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的值是否(以及如何)更改。继续努力。