Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
映射C++;Java的内存排序 我将一个小的C++片段翻译成java,我对内存排序/栅栏不太自信100%。这是否正确:_Java_C++_Memory Fences - Fatal编程技术网

映射C++;Java的内存排序 我将一个小的C++片段翻译成java,我对内存排序/栅栏不太自信100%。这是否正确:

映射C++;Java的内存排序 我将一个小的C++片段翻译成java,我对内存排序/栅栏不太自信100%。这是否正确:,java,c++,memory-fences,Java,C++,Memory Fences,C++: 这样做对吗?(是的,使用不安全与仅使用AtomicLong是有原因的)正确的顺序如下: unsafe.storeFence(); // this fence has to come before the store! unsafe.putLong(addr,1); unsafe.getLong(addr); unsafe.loadFence(); P> C++代码的目的通常是确保,在代码< > Sq.Load(STD::MeMyYyOrthOrthGub)之后,所有在代码> >

C++:


这样做对吗?(是的,使用不安全与仅使用AtomicLong是有原因的)

正确的顺序如下:

unsafe.storeFence(); // this fence has to come before the store!
unsafe.putLong(addr,1);

unsafe.getLong(addr);
unsafe.loadFence();
<> P> C++代码的目的通常是确保,在代码< > Sq.Load(STD::MeMyYyOrthOrthGub)之后,所有在代码> > SEQ.Stury(1,STD::MexyYyOrthOrgRelax)在一个线程中发生的所有存储都可见。代码>在另一个线程中,只要1到
seq
本身的存储变得可见

为了将其传输到Java,您必须确保在
unsafe.getLong(addr)之前没有对加载进行重新排序unsafe.putLong(addr,1)之后,没有存储被重新排序
如果你把
storeFence
放在商店后面,你就不能保证该商店与其他商店相比是如何重新排序的


<>如果你的C++代码有不同的用途,答案可能会有所不同,但是你必须展示一个示例代码来演示你想要达到的目标。

只是猜测,但是我假设你必须在GeLeLon调用之前放置负载栏。loadFence将刷新所有在重新排序缓冲区中的重新排序/挂起的加载,所以我不确定在加载操作之前这会有什么帮助。在我看来,在加载之前立即存储一个似乎是有意义的,但这不是C++是如何写对不起,我的错误。反之亦然。看看我的答案,你确定吗?假设我以前在同一内存地址中有其他存储,可能会被重新排序。我只关心我的加载看到的是“1”值,而不是以前的任何存储,那么为什么我需要在执行“重要”存储之前进行存储围栏?@过锁:我很确定,除非您的原子以非常奇怪的方式使用。顺便说一句:加载和存储是在不同的线程中执行的(否则你就不需要原子了)?也许你应该多看一点程序——否则,总是有一些猜测涉及到他们的目的。“超智能化:我不知道java的不安全。放和取,但是至少C++中,你不会看到任何相同顺序的写访问到同一个内存位置(在同一个线程中)。即使使用宽松的内存排序,它也不会在存储之前将加载重新排序到相同的地址(在同一线程中)。
unsafe.putLong(addr,1);
unsafe.storeFence();

unsafe.getLong(addr);
unsafe.loadFence();
unsafe.storeFence(); // this fence has to come before the store!
unsafe.putLong(addr,1);

unsafe.getLong(addr);
unsafe.loadFence();