【发布时间】:2016-10-06 03:47:09
【问题描述】:
我有以下成员函数:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
return m_person;
}
RAIIMutex 是一个辅助类,它接收互斥体并将其锁定在构造函数中并在析构函数中释放。
m_person 是Person 类型(尺寸非常小)。其他线程中的其他函数可能会更改此成员。
我想按值返回m_person(返回一个副本),当然我想避免m_person在另一个线程中被更改而在返回中被复制的情况,所以我添加了锁.
但是首先会发生什么呢?编译器是先创建m_person 的副本还是先调用myLock 的析构函数?
理论上,这样做很容易解决:
Person ClassB::DoSomethingAndReturnPerson()
{
RAIIMutex myLock(&m_mutex);
Person tmp = m_person;
return tmp;
}
但我很想知道我的问题的答案。
谢谢
【问题讨论】:
-
[OT] 你可以用
std::lock_gurad替换RAIIMutex -
由于copy elision,可能根本不会调用复制构造函数。
-
@JoachimPileborg 这值得怀疑,因为
m_person似乎是一个类成员变量。
标签: c++ return language-lawyer