繁体   English   中英

没有线性化点的方法是否总是无法线性化?

[英]Is a method with no linearization points always not linearizable?

如果您可以肯定地证明某方法没有线性化点,是否一定意味着该方法不可线性化? 另外,作为一个子问题,如何证明方法没有线性化点?

为了建立上述答案, 可以将一种方法描述为可线性化的。 正如djoker提到的书中所提到的: http ://www.amazon.com/dp/0123705916/?tag=stackoverfl08-20

在第69页的练习32中,我们看到

在此处输入图片说明

应当注意,enq()确实是一种方法,被描述为可能线性化/不可线性化。

证明存在线性化点归结为寻找是否存在可能破坏线性化的示例。 如果您假设某个方法中的各种读/写存储操作是可线性化的,然后通过矛盾证明这种假设导致了某些不可线性化的情况,则可以声明前面提到的读/写操作不是有效的线性化点。

以下面的enq()/ deq()方法为例,假设它们是标准队列实现的一部分,其中头/尾指针为tha,后备数组为“ arr”:

public terribleQueue(){
  arr = new T[10];
  tail = 0;
  head = 0;
}

void enq(T x){
  int slot = tail;
  arr[slot] = x;
  tail = tail + 1;
}

T deq(){
  if( head == tail ) throw new EmptyQueueException();
  T temp = arr[head];
  head = head + 1;
  return temp;
}  

在这个可怕的实现中,例如,我们可以轻松地证明enq的第一行不是有效的线性化点,方法是假定它线性化点,然后找到一个显示其他示例,如下所示:

以示例两个线程A和B以及示例历史记录为例:

A: enq( 1 )
A: slot = 0
B: enq( 2 )
B: slot = 0

(A和B现在已经超过了它们的线性化点,因此我们不允许重新排序它们以适应我们的历史)

A: arr[0] = 1
B: arr[0] = 2
A: tail = 1
B: tail = 2

C: deq()
C: temp = arr[0] = 2
C: head = 1
C: return 2

现在我们看到,由于我们选择了线性化点(固定了A和B的顺序),因此无法执行线性化此执行,因为无论将C的deq置于何处,都无法使其返回1。

答案很长,但是我希望这会有所帮助

If you can definitely prove that a method has no linearization points, does it necessarily 
mean that that method is not linearizable?

首先,线性化不是方法的属性,而是执行序列的属性。

how can you prove that a method has no linearizatioon points?

是否能够找到该方法的线性化点取决于执行顺序。

例如,对于FIFO队列中的线程A,我们具有以下序列。 t1,t2,t3是时间间隔。

A.enq(1)A.enq(2)A.deq(1)
t1 t2 t3

对于前两个enq方法,我们可以分别选择线性化点(lp)作为时间间隔t1和t2中的任何点,对于deq可以选择t3中的任何点。 对于这些方法,我们选择的要点是lp。

现在,考虑一个错误的实现

A.enq(1)A.enq(2)A.deq(2)
t1 t2 t3

Linerizability允许lp遵守实时订购。 因此,这些方法的lp应遵循时间顺序,即t1 <t2 <t3。 但是,由于我们的实现不正确,因此我们无法明确地做到这一点。 因此,我们无法找到方法A.deq(2)的线性化点,进而无法找到我们的序列。 太不能衬里了。

希望这对您有所帮助,如果您需要了解更多信息,可以阅读本书: http : //www.amazon.com/Art-Multiprocessor-Programming-Maurice-Herlihy/dp/0123705916

这个答案是基于我第一次阅读有关Wikipedia的线性化,并试图通过先发生后关联将其映射到我对内存一致性的现有理解。 因此我可能会误解这个概念。

如果您可以肯定地证明某方法没有线性化点,是否一定意味着该方法不可线性化?

可能发生这样的情况:共享的可变状态由多个线程同时操作,而没有任何同步或可见性辅助,并且仍然保持所有不变量而没有损坏的风险。

但是,这些情况很少见。

如何证明方法没有线性化点?

据我了解线性化点,在这里我可能是错的,它们是在线程之间建立关系之前发生的地方。 如果一个方法(依次递归调用的每个方法)没有建立这样的关系,那么我会断言它没有线性化点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM