Multithreading CompareAndSwap能否实现CompareExchange?
假设CompareAndSwap(或CAS)从未错误失败,那么CompareExchange可以用CAS实现吗 CompareExchange都接受指针、预期值和新值,如果指针引用的内存与预期值匹配,则自动将其设置为新值。两者之间的区别在于,CompareExchange返回内存区域的上一个值,而CompareAndSwap返回一个bool,指示成功或失败 使用CompareExchange实现CAS非常简单:Multithreading CompareAndSwap能否实现CompareExchange?,multithreading,atomic,Multithreading,Atomic,假设CompareAndSwap(或CAS)从未错误失败,那么CompareExchange可以用CAS实现吗 CompareExchange都接受指针、预期值和新值,如果指针引用的内存与预期值匹配,则自动将其设置为新值。两者之间的区别在于,CompareExchange返回内存区域的上一个值,而CompareAndSwap返回一个bool,指示成功或失败 使用CompareExchange实现CAS非常简单: int CompareExchange (int* p, int expected,
int CompareExchange (int* p, int expected, int newvalue);
bool CAS (int* p, int expected, int newvalue)
{
return CompareExchange (p, expected, newvalue) != expected;
}
。。。但是有可能实现与CAS的比较交换吗?我见过的所有尝试要么有竞争条件,要么不能保证无锁属性。我不相信这是可能的。我不知道这怎么可能。对于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的修改与两个ifs之间的修改无法区分
类似地,您可以基于CAS实现原子交换、原子获取和操作,但它不会是无等待的。我们在这里的思路是相同的,我认为不可能在没有竞争条件的情况下无锁地确定*p。我支持。是的,返回的值不是导致上一次CAS失败的值所必需的,但它实际上并不重要,只要它不同于
预期值
。