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 回答