我正在实现自己的原子类,因为在一个特定的项目中我无法访问C++11原子库。我到目前为止有以下代码:
class CAtomicLong
{
public:
CAtomicLong(long lVal) : m_lValue(lVal) {}
long operator+(long lVal)
{
CAutoLock lock(m_lock);
m_lValue += lVal;
return m_lValue;
}
private:
CMyMutex m_lock;
long m_lValue;
};
假设
CMyMutex
是一个互斥量的自定义包装器,CAutoLock
是一个类,其析构函数在其构造期间解锁传递给它的对象。这些细节对于此问题来说不太相关。我想知道的是,像这样返回
m_lValue
是否安全; 即,在调用 lock
的析构函数之前,它会被复制到寄存器中以供返回吗? 我之所以问是因为我担心出现 torn 读写,因为如果析构函数在设置返回寄存器之前被调用,另一个线程可能会开始修改 m_lValue
,因为它正在被复制以进行返回。我已经查看了 Visual Studio 中类似于此代码的反汇编代码,并且似乎显示在调用析构函数之前进行了返回调用,但是a)我不知道汇编语言(我还在学习 :)),b)我不知道这是否是标准行为(同样,我还在学习)。避免此“潜在”问题的最安全的解决方法是
long operator+(long lVal)
{
CAutoLock lock(m_lock);
long lTemp = (m_lValue += lVal);
return lTemp;
}
...但如果这太过头了,我宁愿现在知道。
operator+
修改了类?它应该是operator+=
吗? - James Adkison