Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中外部同步时jni c本机数据的内存可见性语义_Java_C++_C_Synchronization_Java Native Interface - Fatal编程技术网

在java中外部同步时jni c本机数据的内存可见性语义

在java中外部同步时jni c本机数据的内存可见性语义,java,c++,c,synchronization,java-native-interface,Java,C++,C,Synchronization,Java Native Interface,基本上,我们在java中有一个本机方法,它是通过jni调用的。在调用本机方法之前,java包装器代码正在java对象上同步。在本机方法中,我们有一个预先分配的c结构数组,它通过realloc调整大小。问题是,如果我有另一个线程在同一个java对象上用java进行同步,并通过jni调用另一个本机方法,是否可以保证它将看到重新分配的c结构数组的一致视图。假设c结构字段不是易失的。。如果Java同步块不是jvm堆的一部分,那么它的内存可见性语义基本上会渗透到本机分配的数据。我要的是redhat 4和j

基本上,我们在java中有一个本机方法,它是通过jni调用的。在调用本机方法之前,java包装器代码正在java对象上同步。在本机方法中,我们有一个预先分配的c结构数组,它通过realloc调整大小。问题是,如果我有另一个线程在同一个java对象上用java进行同步,并通过jni调用另一个本机方法,是否可以保证它将看到重新分配的c结构数组的一致视图。假设c结构字段不是易失的。。如果Java同步块不是jvm堆的一部分,那么它的内存可见性语义基本上会渗透到本机分配的数据。我要的是redhat 4和jdk1.6_30 64位。

没有。我认为唯一会“渗透”的是线程的执行流。因此,您的C代码和内存使用需要是线程安全的,或者Java需要确保在任何给定时间只有一个线程运行相关的本机方法。而且,可能从不同线程访问的数据将需要以不稳定的方式访问,而不考虑时间锁定,因为volatile用于防止编译器优化与编译器不可见的访问不兼容。@ChrisStratton他说Java包装函数在调用本机线程之前正在Java对象上同步,所以Java层正在确保线程安全性。他们问“Java synchronized block的内存可见性语义是否会渗透到本机分配的数据”,答案是“不仅仅是执行流”会渗透到本机分配的数据。即使在确保了这一点的情况下,如果可能发生编译器在考虑优化时无法预料的访问,也需要volatile。