我正在将一小段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();这是沿着正确的路线吗?(是的,使用不安全与只使用AtomicLong相比,有一个原因)
发布于 2015-03-27 05:07:47
正确的排序列表如下:
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++代码有不同的用途,答案可能会有所不同,但对于这种情况,您必须显示一个示例代码来演示您试图实现的目标。
https://stackoverflow.com/questions/29285506
复制相似问题