gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:22:20 26 4
gpt4 key购买 nike

我在一个特定项目上实现我自己的原子类,在其中我无法访问 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 的析构函数之前返回吗?我问是因为我担心读取和写入中断,因为如果在 返回寄存器设置之前调用析构函数,另一个线程可能会开始修改 m_lValue 因为它正在被复制返回。

我已经查看了 Visual Studio 中的反汇编代码,它似乎显示了在调用析构函数之前进行的返回调用,但是 a) 我真的不知道我正在看的汇编(我还在学习 :))和 b) 我不知道这是否是标准行为(同样,我还在学习)。解决此潜在问题的最安全方法是

long operator+(long lVal)
{
CAutoLock lock(m_lock);
long lTemp = (m_lValue += lVal);
return lTemp;
}

...但如果这有点矫枉过正,我宁愿现在就知道。

最佳答案

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

The copy-initialization of the result of the call is sequenced before the destruction of temporaries at the end of the full-expression established by the operand of the return statement, which, in turn, is sequenced before the destruction of local variables (6.6) of the block enclosing the return statement.

关于c++ - 返回值寄存器和析构函数调用顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38210883/

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