首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++内存排序映射到Java

将C++内存排序映射到Java
EN

Stack Overflow用户
提问于 2015-03-27 01:52:28
回答 1查看 197关注 0票数 2

我正在将一小段C++代码翻译成java,我对内存顺序/栅栏不是100%有把握。这是正确的吗:

C++:

代码语言:javascript
复制
std::atomic<size_t> seq;
...
seq.store(1,std::memory_order_release);
...
seq.load(std::memory_order_acquire);

我认为它应该如何翻译成Java:

代码语言:javascript
复制
unsafe.putLong(addr,1);
unsafe.storeFence();

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

这是沿着正确的路线吗?(是的,使用不安全与只使用AtomicLong相比,有一个原因)

EN

回答 1

Stack Overflow用户

发布于 2015-03-27 05:07:47

正确的排序列表如下:

代码语言:javascript
复制
unsafe.storeFence(); // this fence has to come before the store!
unsafe.putLong(addr,1);

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

c++代码的目的通常是确保在一个线程中的seq.store(1,std::memory_order_release)之前发生的所有存储对于另一个线程中的seq.load(std::memory_order_acquire);之后的所有加载都是可见的,只要将1存储到seq本身就可见。

为了将其传输到Java,您必须确保在unsafe.putLong(addr,1);之前没有重新排序加载,也没有重新排序存储

如果你把storeFence放在商店后面,你就得不到任何关于该商店与其他商店相比是如何被重新排序的保证。

如果您的c++代码有不同的用途,答案可能会有所不同,但对于这种情况,您必须显示一个示例代码来演示您试图实现的目标。

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

https://stackoverflow.com/questions/29285506

复制
相关文章

相似问题

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