C++;AtomicLong.lazySet端口 我试图将一些java代码移植到Windows C++中,并且对如何实现< AtomicLong > LaZyStET()/感到困惑。我能找到的唯一信息是关于它的功能,而不是如何实现它,并且可用的源代码最终被放在Sun拥有的私有本机库中(Sun.misc.Unsafe.class)

C++;AtomicLong.lazySet端口 我试图将一些java代码移植到Windows C++中,并且对如何实现< AtomicLong > LaZyStET()/感到困惑。我能找到的唯一信息是关于它的功能,而不是如何实现它,并且可用的源代码最终被放在Sun拥有的私有本机库中(Sun.misc.Unsafe.class),java,c++,atomic,Java,C++,Atomic,我目前只是将一个成员变量设置为传递的参数,但我不确定它是否正确 class AtomicLong { public: inline void LazySet(__int64 aValue) { // TODO: Is this correct? iValue = aValue; } inline void Set(__int64 aValue) { ::InterlockedExchange64(&

我目前只是将一个成员变量设置为传递的参数,但我不确定它是否正确

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;
};
我不能用boost

编辑: 我正在编译到x64,但32位代码的解决方案可能会对其他人有所帮助


我没有访问C++11的权限。

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;
};
类原子长
{
公众:
内嵌无效懒散集(int64\t aValue)
{
存储(aValue,std::内存\u顺序\u松弛);
}
内联无效集(int64\t aValue)
{
艾瓦鲁商店(aValue);
}
私人:
std::原子荧光;
};

//TODO:这正确吗?
我认为在64位系统上是正确的,但在32位系统上不是。你试过源代码吗?它用开源组件取代了大部分(全部?)Sun专有代码,也许你可以在AtomicLong及其本机库的实现上取得一个高峰。谢谢,不过VC++2010不支持C++11。LazySet中的
iValue.store
生成了什么代码?