首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能把这个C++代码(从OpenJDK6)翻译成简单的英语吗?

有人能把这个C++代码(从OpenJDK6)翻译成简单的英语吗?
EN

Stack Overflow用户
提问于 2011-08-24 02:58:35
回答 2查看 645关注 0票数 4

下面是来自hotspot/src/share/vm/prims/unsafe.cpp的代码片段(从第1082行开始):

代码语言:javascript
复制
// JSR166 ------------------------------------------------------------------

UNSAFE_ENTRY(jboolean, Unsafe_CompareAndSwapObject(JNIEnv *env, jobject unsafe, jobject obj, jlong offset, jobject e_h, jobject x_h))
  UnsafeWrapper("Unsafe_CompareAndSwapObject");
  oop x = JNIHandles::resolve(x_h);
  oop e = JNIHandles::resolve(e_h);
  oop p = JNIHandles::resolve(obj);
  HeapWord* addr = (HeapWord *)index_oop_from_field_offset_long(p, offset);
  if (UseCompressedOops) {
    update_barrier_set_pre((narrowOop*)addr, e);
  } else {
    update_barrier_set_pre((oop*)addr, e);
  }
  oop res = oopDesc::atomic_compare_exchange_oop(x, addr, e);
  jboolean success  = (res == e);
  if (success)
    update_barrier_set((void*)addr, x);
  return success;
UNSAFE_END

另外还添加了关键方法oopDesc::atomic_compare_exchange_oop

代码语言:javascript
复制
 inline oop oopDesc::atomic_compare_exchange_oop(oop exchange_value,
                                                    volatile HeapWord *dest,
                                                    oop compare_value) {
      if (UseCompressedOops) {
        // encode exchange and compare value from oop to T
        narrowOop val = encode_heap_oop(exchange_value);
        narrowOop cmp = encode_heap_oop(compare_value);

        narrowOop old = (narrowOop) Atomic::cmpxchg(val, (narrowOop*)dest, cmp);
        // decode old from T to oop
        return decode_heap_oop(old);
      } else {
        return (oop)Atomic::cmpxchg_ptr(exchange_value, (oop*)dest, compare_value);
      }
    }

这段代码在JVM上下文中的用途是什么?我对C++没有经验。

原子::cmpxchg& Atomic::cmpxchg_ptr变成OS & CPU &32位/64位依赖。所以JVM在这里分裂了。

编辑

正如steve所指出的,CAS作为ABA问题有其弱点,因此这里需要内存屏障来确保CAS在多线程环境中仍然正确。此外,由于CAS需要三个参数--地址、旧值和新值,因此这个过程需要现代CPU。

编辑

对于新的C++0x标准 (现在还没有正式发布?),这是否意味着JVM不需要被拆分呢?至少在源代码级别。二进制文件仍然可以拆分,但它将由C++编译器处理。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-24 04:13:48

它是CAS API的JNI包装器,记忆屏障用于IA64体系结构

编辑:以获得对CAS的描述:

将dest与比较值进行比较,如果匹配,则将交换值分配给dest。

它是一个原子运算,这意味着在执行操作时,没有其他处理器可以更改dest的值。

这里列出了在不使用原子操作的情况下可能发生的典型问题,"ABA问题“。

问题

为什么要使用CAS函数?

简单的示例是计数器,如果有多个线程在递增计数器,请考虑增量进程的作用:

代码语言:javascript
复制
int i;
read the value of i
add one to the current value
save the value back to i.

当另一个处理器读取i的值并在此处理器完成之前保存i+1,会发生什么情况?

最后是i+1而不是i+ 2。

票数 5
EN

Stack Overflow用户

发布于 2011-08-25 05:00:09

以下是一些关于

  • 什么是oop,为什么要压缩它们?

HotSpot术语中的"oop“或”普通对象指针“是指向对象的托管指针。它通常与本地机器指针的大小相同,这意味着LP64系统上的64位。在ILP32系统上,最大堆大小略小于4Gb,这对许多应用程序来说是不够的。

  • 哪个oops被压缩了?

在ILP32 32模式JVM中,或者如果在UseCompressedOops模式下关闭了LP64标志,则所有oops都是本机字大小。

如果UseCompressedOops为真,堆中的以下oops将被压缩:

·每个对象的klass字段.每个oop实例字段. oop数组(objArray)的每个元素

有关详细信息,请查看此孙维基

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7169961

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档