2012-08-09 78 views
6

我想將一些Java代碼移植到Windows C++,並且對如何實現AtomicLong.lazySet()感到困惑。我可以找到的唯一信息是關於它的功能,但不知道如何實現它,而可用的源代碼最終在Sun擁有的私有本地庫(sun.misc.Unsafe.class)中。C++端口的AtomicLong.lazySet

我目前只是設置一個成員變量傳遞參數,但我不知道它是否正確。

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 2012-08-09 16:53:39

+0

你有沒有試過[OpenJDK](http://openjdk.java.net/)的源代碼?它用開源組件取代了大部分(所有?)Sun專有代碼,也許你可以在實現AtomicLong和它的本地庫方面取得一個高峯。 – 2012-08-09 17:53:46

回答

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 2012-08-09 17:41:05