具有获取和释放语义的互锁操作(多平台)

编辑: 好的,我有一个具体的问题。我想用获取和释放语义(伪代码)实现“交换”功能:
interlocked_inc_32(target)
{
    mov  ecx, 1
    lea  eax, target
    lock xadd, [eax], ecx
}

interlocked_inc_32_acq(target)
{
    lfence
    mov  ecx, 1
    lea  eax, target
    lock xadd, [eax], ecx
}

interlocked_inc_32_rel(target)
{
    sfence
    mov  ecx, 1
    lea  eax, target
    lock xadd, [eax], ecx
}
问题是:我不知道如何实现这一点。我正在使用Microsofts Visual Studio 2010在Windows下开发。当然,有“intrin.h”和“Windows.h”,它们提供了这些功能/内在函数。但InterlockedIncrementAcquire只是InterlockedIncrement的定义,并提供完整的内存屏障。那不是我追求的。 / ********* 原帖: / ********* 我想写一个像C ++ 0x std :: atomic这样的原子类。 我只是想确定我的想法是否正确。 我想实现以下代码: 编辑(替换不好的实现)
enum memory_order { memory_order_acquire, memory_order_release, memory_order_acq_rel };

template<class T> class atomic;
template<class atomic_type, std::size_t = sizeof(typename ExtractType<atomic_type>::type)> struct interlocked;

template<template<class> class atomic_type> struct interlocked<atomic_type, 1>
{
    typedef typename ExtractType<atomic_type>::type bit8_type;

    void store(bit8_type value, memory_order order = memory_order_acq_rel) volatile {
        interlocked_xchg_8<order>(&static_cast<atomic_type volatile*>(this)->m_value, value);  
    }

    bit8_type load(memory_order order = memory_order_acq_rel) const volatile
    { 
        interlocked_cmp_xchg_8<order>(
            const_cast<bit8_type volatile*>(&static_cast<volatile const atomic_type *const>(this)->m_value), 
            static_cast<atomic_type const volatile*>(this)->m_value, 
            static_cast<atomic_type const volatile*>(this)->m_value
        ); 
    }

    bit8_type exhange(bit8_type, memory_order order = memory_order_acq_rel) volatile {
        return interlocked_xchg_8<order>(&static_cast<atomic_type volatile*>(this)->m_value, value);
    }

    bool compare_exchange(bit8_type comperand, bit8_type new_value, memory_order order = memory_order_acq_rel) volatile 
    {
        return interlocked_cmp_xchg_8<order>(
            &static_cast<atomic_type volatile*>(this)->m_value,
            new_value,
            comperand
        ) == comperand;

    }
};

template<template<class> class atomic_type> struct interlocked<atomic_type, 2> { };
template<template<class> class atomic_type> struct interlocked<atomic_type, 4> { };
template<template<class> class atomic_type> struct interlocked<atomic_type, 8> { };


template<class T>
class atomic : public interlocked<atomic<T>> { T m_value; };
有什么我缺少的东西,或者这是一个“好的”非常好的实现。 谢谢你的评论。最好的祝福: PS: 我不想为此开始一个新问题: 使用boost :: uint32_t(在boost cstdint.h中)而不是uint32_t(在stdint.h中)有什么好处?     
已邀请:
你的目标是x86硬件吗?它的缓存同步方案是否意味着您获得了完整的内存屏障?你是如何改进的呢?     
您在这里面临的问题是锁前缀意味着完整的内存屏障(mfence)。也就是说,因为在之前的x86处理器上没有不同类型的内存屏障和单独的sfence / lfence指令。     

要回复问题请先登录注册