c++ - 在 C++ 中,类 Java 对象监视器的最有效实现是什么?

标签 c++ multithreading synchronized

在 Java 中,每个对象都有一个同步监视器。所以我猜这个实现在内存使用方面非常精简,希望速度也很快。

当将它移植到 C++ 时,什么是它的最佳实现。我认为一定有比“pthread_mutex_init”更好的东西,还是 java 中的对象开销真的这么高?

编辑:我刚刚检查过 Linux i386 上的 pthread_mutex_t 有 24 个字节大。如果我必须为每个对象保留这个空间,那就太庞大了。

最佳答案

从某种意义上说,它实际上比 pthread_mutex_init 更糟糕。由于 Java 的等待/通知,您需要一对互斥锁和条件变量来实现监视器。

在实践中,当实现 JVM 时,您会寻找并应用书中每一个特定于平台的优化,然后发明一些新的优化,以使监视器尽可能快。如果你不能在这方面做一个非常艰巨的工作,那么你肯定达不到优化垃圾收集的水平;-)

一个观察是不是每个对象都需要有自己的监视器。当前未同步的对象不需要同步。因此 JVM 可以创建一个监视器池,每个对象都可以有一个指针字段,当线程真正想要在对象上同步时(例如,使用特定于平台的原子比较和交换操作)填充该指针字段。因此监视器初始化的成本不必添加到对象创建的成本中。假设内存被预先清除,对象创建可以是:递减一个指针(加上某种边界检查,对运行 gc 的代码有一个预测为假的分支等等);填写类型;调用最派生的构造函数。我认为您可以安排 Object 的构造函数什么也不做,但显然很大程度上取决于实现。

在实践中,普通的 Java 应用程序不会在任何时候同步很多对象,因此监控池在时间和内存方面可能是一个巨大的优化。

关于c++ - 在 C++ 中,类 Java 对象监视器的最有效实现是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1752897/

相关文章:

c++ - 使用双向链表的 Queue 中的 Remove() 函数

c++ - 从另一个非 gui 线程启动 QTimer

java - 使用 'this' 与另一个对象作为同步块(synchronized block)中的等待和通知锁

java - 方法同步,但由于非序列化线程行为,代码产生随机结果

c++ - C 哪里不是 C++ 的子集?

C++ 操纵器

java - 使用 JNA native 等待调用检测线程中断 (Windows)

在Linux上的多线程C服务器中创建新的文件描述符

java - 为什么这个同步方法没有按预期工作?

c++ - 使用 C++ 中的最大似然法将 1000 个样本拟合为正态分布