Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading CompareAndSwap能否实现CompareExchange?_Multithreading_Atomic - Fatal编程技术网

Multithreading CompareAndSwap能否实现CompareExchange?

Multithreading CompareAndSwap能否实现CompareExchange?,multithreading,atomic,Multithreading,Atomic,假设CompareAndSwap(或CAS)从未错误失败,那么CompareExchange可以用CAS实现吗 CompareExchange都接受指针、预期值和新值,如果指针引用的内存与预期值匹配,则自动将其设置为新值。两者之间的区别在于,CompareExchange返回内存区域的上一个值,而CompareAndSwap返回一个bool,指示成功或失败 使用CompareExchange实现CAS非常简单: int CompareExchange (int* p, int expected,

假设CompareAndSwap(或CAS)从未错误失败,那么CompareExchange可以用CAS实现吗

CompareExchange都接受指针、预期值和新值,如果指针引用的内存与预期值匹配,则自动将其设置为新值。两者之间的区别在于,CompareExchange返回内存区域的上一个值,而CompareAndSwap返回一个bool,指示成功或失败

使用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的比较交换吗?我见过的所有尝试要么有竞争条件,要么不能保证无锁属性。我不相信这是可能的。

我不知道这怎么可能。对于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失败的值所必需的,但它实际上并不重要,只要它不同于
预期值