2012-08-09 40 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