返回值寄存器和析构函数调用顺序

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)

......但如果这有点矫枉过正我现在就知道了.

Ker*_* SB 6

你的代码是正确的.[stmt.return]/3说:

调用结果的复制初始化在由return语句的操作数建立的全表达式结束时临时销毁之前进行排序,然后在本地变量的销毁之前对其进行排序(6.6)包含return语句的块的.