C 锡尔伯沙茨原子增量澄清

C 锡尔伯沙茨原子增量澄清,c,concurrency,atomic,compare-and-swap,C,Concurrency,Atomic,Compare And Swap,比较和交换函数的Silberschatz实现如下 int compare_and_swap(int *value, int expected, int new_value) { int temp = *value; if (*value == expected) *value = new_value; return temp; } 它可以用来实现原子增量函数 void increment(atomic_int *v) { int temp;

比较和交换函数的Silberschatz实现如下

int compare_and_swap(int *value, int expected, int new_value) {
    int temp = *value;
    if (*value == expected)
        *value = new_value;
    return temp;
}
它可以用来实现原子增量函数

void increment(atomic_int *v)
{
    int temp;
    do {
        temp = *v;
    }
    while (temp != compare_and_swap(v, temp, temp+1));
}
我的问题是:在什么情况下,do while条件为true会触发第二个循环,从而触发第二次
compare\u和\u swap
调用

根据我的理解,
compare_and_swap
总是返回旧的
v
,但是在调用它之前,
temp
值用
v
值初始化,因此
compare_and_swap
首先返回
temp
,然后返回导致退出循环的条件


我遗漏了什么吗?

增量
函数实现中,如果增量操作成功,do while循环的测试条件将失败

因此,您对
compare\u和\u swap
函数始终返回相同变量的理解是绝对正确的,因为函数在执行时没有任何中断

但是当多个线程试图访问同一个变量时,情况可能并非如此。在这些场景下,我们得到do while循环的测试条件为true,因此尝试在第二个循环中增加变量,以此类推

例如:假设有两个线程写入同一个变量
v=0
。 第一个线程正在执行
increment
函数,并在指令
temp=*v之后被中断。在此之后,第二个线程被赋予控件,它完成增量函数,之后,只有控件返回到线程1

因此,在这种情况下,当控件返回时,变量的状态如下:

v = 1 \\ Got incremented after the thread-2 execution completed
temp = 0 \\ Was set before thread-1 was interrupted
现在,当while测试条件执行时,
compare_and_swap
返回1,但
temp
为0。因此,测试失败,并重新执行循环体