gpt4 book ai didi

c++ - 如何编写安全的原子对象包装器?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:22:33 25 4
gpt4 key购买 nike

我一直在尝试编写一个包装类来包装 Win32 内部函数,例如 InterlockedIncrementInterlockedExchange。尽管我的问题可能与支持类似内在函数的其他平台类似。

我有一个基本的模板类型:

template <typename T, size_t W = sizeof(T)>
class Interlocked {};

它部分专门用于不同大小的数据类型。例如,这是 32 位的:

//
// Partial specialization for 32 bit types
//
template<typename T>
class Interlocked <T, sizeof(__int32)>
{
public:

Interlocked<T, sizeof(__int32)>() {};

Interlocked<T, sizeof(__int32)>(T val) : m_val(val) {}

Interlocked<T, sizeof(__int32)>& Interlocked<T, sizeof(__int32)>::operator= (T val)
{
InterlockedExchange((LONG volatile *)&m_val, (LONG)val);
return *this;
}

Interlocked<T, sizeof(__int32)> Interlocked<T, sizeof(__int32)>::operator++()
{
return static_cast<T>(InterlockedIncrement((LONG volatile *)&m_val));
}

Interlocked<T, sizeof(__int32)> Interlocked<T, sizeof(__int32)>::operator--()
{
return static_cast<T>(InterlockedDecrement((LONG volatile *)&m_val));
}

Interlocked<T, sizeof(__int32)>& Interlocked<T, sizeof(__int32)>::operator+(T val)
{
InterlockedExchangeAdd((LONG volatile *)&m_val, (LONG) val);
return *this;
}

Interlocked<T, sizeof(__int32)>& Interlocked<T, sizeof(__int32)>::operator-(T val)
{
InterlockedExchangeSubtract((LONG volatile *)&m_val, (LONG) val);
return *this;
}

operator T()
{
return m_val;
}

private:

T m_val;
};

但是,我得出的结论是我不知道如何安全地编写这样一个对象。具体来说,我意识到在执行互锁操作后返回 *this 允许另一个线程在变量返回之前更改变量。这使类型的点无效。有没有可能写出这样的东西?大概 std::atomic 解决了这个问题,但我无法在我的编译器中访问它......

最佳答案

如果你没有std::atomic,你可以使用boost::atomic(出现在最新的Boost 1.53),这是经过很好的交叉测试-平台实现。

关于c++ - 如何编写安全的原子对象包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16565913/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com