【问题标题】:Silberschatz atomic increment clarificationSilberschatz 原子增量澄清
【发布时间】:2020-11-17 16:18:49
【问题描述】:

比较和交换函数的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 条件为真以触发第二个循环,从而触发第二个 compare_and_swap 调用?

据我了解,compare_and_swapalways 返回旧的v,但在调用它之前,temp 值已使用v 值初始化,因此compare_and_swap 首先返回temp,并且条件比失败导致退出循环。

我错过了什么吗?

【问题讨论】:

    标签: c concurrency atomic compare-and-swap


    【解决方案1】:

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

    因此,您对compare_and_swap 函数总是返回相同变量的理解是绝对正确的,因为函数执行时没有任何中断。

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

    例如:假设有两个线程写入同一个变量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。因此测试失败并重新执行循环体。

    【讨论】:

      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 2017-09-09
      • 2018-06-30
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多