6

一部の Java コードを Windows C++ に移植しようとしていますが、実装方法について混乱していますAtomicLong.lazySet()。私が見つけることができる唯一の情報は、それが何をするかについての話であり、それを実装する方法については話していません.利用可能なソースコードは、Sunが所有するプライベートネイティブライブラリになります( sun.misc.Unsafe.class).

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

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

1 に答える 1

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;
};
于 2012-08-09T17:35:38.873 に答える