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();

これは正しい線に沿っていますか?(そして、AtomicLong を使用するだけではなく、unsafe を使用する理由もあります)

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 に答える