Wad*_*Wad 3 c++ multithreading
我正在实现我自己的原子类,因为在我无法访问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;
};
Run Code Online (Sandbox Code Playgroud)
假设这CMyMutex是一个围绕互斥锁的自定义包装器,并且CAutoLock是一个类,其析构函数解锁在构造期间传递给它的对象.无论如何,这些细节在很大程度上与这个问题无关.
我想知道的是,这样返回是否安全m_lValue; 即它是否会被复制到寄存器中以在lock调用析构函数之前返回?我问,因为我担心撕裂的读取和写入,因为如果在设置返回寄存器之前调用析构函数,则另一个线程可以m_lValue在复制以进行返回时开始修改.
我已经看过Visual Studio中的反汇编这样的代码,它似乎显示了在调用析构函数之前进行的返回调用,但是a)我真的不知道我在使用汇编看到了什么(我我还在学习:))和b)我不知道这是否是标准行为(再次,我还在学习).这个潜在问题最安全的解决方法是
long operator+(long lVal)
{
CAutoLock lock(m_lock);
long lTemp = (m_lValue += lVal);
return lTemp;
}
Run Code Online (Sandbox Code Playgroud)
......但如果这有点矫枉过正我现在就知道了.
你的代码是正确的.[stmt.return]/3说:
调用结果的复制初始化在由return语句的操作数建立的全表达式结束时临时销毁之前进行排序,然后在本地变量的销毁之前对其进行排序(6.6)包含return语句的块的.
| 归档时间: |
|
| 查看次数: |
166 次 |
| 最近记录: |