C 锡尔伯沙茨原子增量澄清
比较和交换函数的Silberschatz实现如下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;
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。因此,测试失败,并重新执行循环体