簡體   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