atomic_dec_if_positive原子如何?

时间:2016-04-20 16:27:22

标签: c linux-kernel atomic

所以我正在从here的Linux源代码中阅读var app = document.createElement('applet'); app.id = 'myapplet'; app.archive = 'applet/applet.jar'; app.code = 'MyApplet.class'; app.jnlp_href = "applet/applet.jnlp"; document.getElementsByTagName('body')[0].appendChild(app);(在谷歌上找到它。我不确定它是否合法)而且我无法理解这一点:

这是怎么回事?

atomic.h

2 个答案:

答案 0 :(得分:3)

它使用函数jvisualvm.exeatomic_read(),它们肯定会使用微处理器指令集的原子性特性以汇编语言实现。

它首先读取一个值并确保它是正数,将读取值存储在atomic_cmpxchg()中,将值减少到c并调用dec,这将原子地执行以下操作:仅当atomic_cmpxchg()中的值等于dec时,才在*v中写*v,并在c中返回旧值。这样你就可以确保*v中的值在两个原子调用之间没有改变。如果失败并且返回值与*v的预期内容不同,则会重试整个过程。

答案 1 :(得分:2)

以下一行

c = atomic_read(v);

意味着此时我们知道atomic_v变量== c的值。我们 减少c给我们所需的价值。

dec = c - 1;

显然,如果数字不是正数且0不是正数,我们就不能 减少它。

if (unlikely(dec < 0))
        break;

现在我们尝试使用预期结果更改已知的旧结果

old = atomic_cmpxchg((v), c, dec);

这被定义为

int atomic_cmpxchg(atomic_t *v, int old, int new);

如果我们按如下方式写出来并假设整个函数是原子的。我们有

int atomic_cmpxchg(atomic_t *v, int old, int new) {
  &v->counter = &v->counter == old ? new : old;
  return old;
}

注意,我将v视为一个整数,在x86上它是一个结构。此时我们 知道在原子操作发生的时候,我们得到了 旧的价值。我们预期的旧值是c,所以如果是这种情况那么我们就有了 成功递减该值,返回结果。

if (likely(old == c))
        break;

如果不是,我们需要重置我们的期望值,即我们的起点,我们将递减一个新值c,而不是我们上次进入for(;;)循环时的旧值{/ 1>

c = old;

这里的重要部分是这是一个循环,这个循环将继续,直到它成功递减值或值为非正。