簡體   English   中英

可以使用CompareAndSwap實現CompareExchange嗎?

[英]Can CompareExchange be implemented with CompareAndSwap?

假設CompareAndSwap(或CAS)永遠不會虛假失敗,CompareExchange是否可以用CAS實現?

CompareExchange都使用一個指針,一個期望值和一個新值,並在該指針引用的內存與期望值匹配的情況下自動將其設置為新值。 兩者之間的區別在於,CompareExchange返回內存區域的先前值,而CompareAndSwap返回指示成功或失敗的布爾值。

用CompareExchange實現CAS很簡單:

int CompareExchange (int* p, int expected, int newvalue);

bool CAS (int* p, int expected, int newvalue)
{
   return CompareExchange (p, expected, newvalue) != expected;
}

...但是可以用CAS實現CompareExchange嗎? 我見過的所有嘗試都有競爭條件,或者不能保證無鎖屬性。 我不認為有可能。

我不知道怎么可能。 對於CAS失敗的情況,您將需要單獨的操作來獲取先前的值。 相對於CAS,此單獨操作將不是原子的。

您可以在那兒找到路:

int CompareExchnage(int *p, int expected, int newvalue)
{
    if (CAS(p, expected, newvalue))
        return expected;
    else
        ???;
}

在出現問題的情況下,CAS會失敗。 獲得*p來查找先前的值相對於CAS而言不是原子的,因此您可能會遇到競爭狀況,或者必須鎖定CAS和*p取消引用。

您可以,它是無鎖的,但它不是免費的:

int CompareExchange(int *p, int expected, int newvalue)
{
    for (;;) {
        oldValue = *p;
        if (oldValue != expected)
            return oldValue;
        if (CAS(p, expected, newvalue))
            return expected;
    }
}

這個想法是,從CompareExchange返回之后對* p的修改與兩個if之間的修改是無法區分的。

同樣,您可以基於CAS來實現原子交換和原子獲取和操作,但它並非沒有等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM