Is a method with no linearization points always not linearizable?

后端 未结 3 603
时光说笑
时光说笑 2021-02-11 03:08

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

3条回答
  •  灰色年华
    2021-02-11 03:46

    To build upon the answers described above, a method can be described as linearizable. As referenced in the book that djoker mentioned: http://www.amazon.com/dp/0123705916/?tag=stackoverfl08-20

    on page 69, exercise 32, we see

    It should be noted that enq() is indeed a method, that is described as possibily being linearizable/not linearizable.

    Proving that there are linearizable points comes down to finding if there are examples that can break linearizability. If you make the assumption that various read/write memory operations in a method are linearizable, and then prove by contradiction that there are non-linearizable situations that result from such an assumption, you can declare that the previously mentioned read/write operation is not a valid linearization point.

    Take, for example, the following enq()/deq() methods, assuming they are part of a standard queue implementation with head/tail pointers thaand a backing array "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;
    }  
    

    In this terrible implementation, we can easily prove, for example, that the first line of enq is not a valid linearization point, by assuming that it is a linearization point, and then finding an example displaying otherwise, as seen here:

    Take the example two threads, A and B, and the example history:

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

    (A and B are now past their linearization points, therefore we are not allowed to re-order them to fit our history)

    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
    

    Now we see that because of our choice of linearization point (which fixes the order of A and B), this execution will be impossible make linearizable, because we cannot make C's deq return 1, no matter where we put it.

    Kind of a long winded answer, but I hope this helps

提交回复
热议问题