2

我正在将一个小的 C++ 片段翻译成 java,我对内存排序/栅栏不是 100% 有信心。这个对吗:

C++:

std::atomic<size_t> seq;
...
seq.store(1,std::memory_order_release);
...
seq.load(std::memory_order_acquire);

我认为它应该如何转换为 Java:

unsafe.putLong(addr,1);
unsafe.storeFence();

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

这是正确的路线吗?(是的,使用 unsafe 与仅使用 AtomicLong 是有原因的)

4

1 回答 1

1

正确的排序如下:

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

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

C++ 代码的目的通常是确保,一旦 1 对自身的存储变得可见,之前在一个线程中发生的所有存储对另一个线程seq.store(1,std::memory_order_release)中的所有加载都是可见的。seq.load(std::memory_order_acquire);seq

为了将其转移到 Java,您必须确保之前没有重新排序加载,之后unsafe.getLong(addr);也没有重新unsafe.putLong(addr,1);
排序storeFence存储店铺。

如果你的 c++ 代码有不同的目的,答案可能会有所不同,但为此你必须展示一个示例代码来演示你想要实现的目标。

于 2015-03-26T21:07:46.527 回答