我正在尝试将一些Java代码移植到Windows C++,并且对如何实现AtomicLong.lazySet()感到困惑。我能找到的唯一信息只是关于其功能的讨论,而不是如何实现的,可用的源代码最终存储在Sun拥有的私有(private) native 库中(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。

最佳答案

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;
};

10-08 03:54