编辑:
好的,我有一个具体的问题。我想用获取和释放语义(伪代码)实现“交换”功能:
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
}
问题是:我不知道如何实现这一点。我正在使用 Microsoft 的 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 硬件吗?它的缓存同步方案是否意味着您得到的是完整的内存屏障?你打算如何改进?
关于c++ - 具有获取和释放语义的互锁操作(多平台),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4802773/