Concurrency 如何证明并发对象是可线性化的?

Concurrency 如何证明并发对象是可线性化的?,concurrency,cpu-registers,mutual-exclusion,Concurrency,Cpu Registers,Mutual Exclusion,有没有一种方法可以证明一个物体是否可以线性化? 例如下面的代码。我如何证明计数器是线性的 以下是共享计数器的算法: CompareAndSet R = new CompareAndSet(0); increment() { Boolean ret; int r; repeat r = R.read(); ret = R.cas(r, r+1) until(ret = true) return } read() { return R.read(); } Compa

有没有一种方法可以证明一个物体是否可以线性化? 例如下面的代码。我如何证明计数器是线性的

以下是共享计数器的算法:


CompareAndSet R = new CompareAndSet(0);

increment() {
   Boolean ret; int r;
   repeat r = R.read(); ret = R.cas(r, r+1)
   until(ret = true)
   return
}

read() {
 return R.read();
}
CompareAndSet是一个包含以下内容的对象:

  • 整数v
  • 方法read():返回v的值
  • 方法cas(预期,更新):接受两个参数:一个
    预期的
    值和一个
    更新
    值。如果当前
    v
    值等于预期值,则将其替换为更新值;否则,该值保持不变。方法调用返回一个布尔值,指示值
    v
    是否已更改
一般来说,您需要证明,对于每个变异并发对象的方法,都有一个“线性化点”,该点是该方法生效的地方


对于你的柜台来说,这是微不足道的。如果我们假设
R.cas()
是以原子方式执行的,那么
increment()
中的线性化点就是
R.cas()
成功更新值的时间。

我们如何证明线性化点是线性化点?