![](/img/trans.png)
[英]Can Interlocked CompareExchange be used correctly in this multithreaded round-robin implementation?
[英]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.