2012-08-09 3 views
6

私はいくつかのJavaコードをWindows C++に移植しようとしています。AtomicLong.lazySet()の実装方法について混乱しています。見つけられる唯一の情報は、それがどういうものなのかということではなく、それを実装する方法ではなく、入手可能なソースコードはSunが所有する私的なネイティブライブラリ(sun.misc.Unsafe.class)で終わります。AtomicLong.lazySetのC++ポート

現在、渡されたパラメータにメンバー変数を設定していますが、正しいかどうかはわかりません。

class AtomicLong 
{ 
public: 
    inline void LazySet(__int64 aValue) 
    { 
     // TODO: Is this correct? 
     iValue = aValue; 
    } 

    inline void Set(__int64 aValue) 
    { 
     ::InterlockedExchange64(&iValue, aValue); 
    } 

private: 
    __declspec(align(64)) volatile __int64 iValue; 
}; 

私はブーストを使用できません。

編集: 私はx64にコンパイルしていますが、おそらく32ビットコードの解決策は他の人に役立つでしょう。

私はC++ 11にアクセスできない。

+4

* '// TODO:?これは正しいです' *私はそれが64ビットシステム上で正しいことだと思います32ビットシステムではありません。 – Mehrdad

+0

[OpenJDK](http://openjdk.java.net/)ソースを試しましたか?これはSun独自のコードのほとんど(すべて?)をオープンソースのコンポーネントに置き換えたもので、AtomicLongとそのネイティブライブラリの実装をピークにすることができます。 –

答えて

2

C++ 11原子のライブラリが含まれており、あなたはそれを使用することができれば、それは簡単です:

class AtomicLong 
{ 
public: 
    inline void LazySet(int64_t aValue) 
    { 
     iValue.store(aValue, std::memory_order_relaxed); 
    } 
    inline void Set(int64_t aValue) 
    { 
     iValue.store(aValue); 
    } 
private: 
    std::atomic<int64_t> iValue; 
}; 
+0

おかげさまで、VC++ 2010はC++ 11をサポートしていません。 LazySetの 'iValue.store'はどのコードを生成しますか? – James