所以我正在从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
答案 0 :(得分:3)
它使用函数jvisualvm.exe
和atomic_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;
这里的重要部分是这是一个循环,这个循环将继续,直到它成功递减值或值为非正。