MyClass
有一个成员函数,需要返回其'成员变量,和
该函数必须是线程安全的,因此我使用互斥锁来保护数据。
我有两个实现如下:
版本1:
string MyClass::name() {
m_mutex.lock();
string temp = m_name;
m_mutex.unlock();
return temp;
}
版本2:
string MyClass::name() {
MutexLocker lock(mutex);
return m_name;
}
我知道版本1没有问题,但我需要输入更多代码。
问题是,我不确定版本2是否正确。是否会在线程访问m_name
之前释放互斥锁?
答案 0 :(得分:14)
版本2也是正确的(实际上,它比第一个版本更好!)。
在通过本地对象的析构函数释放互斥锁之前,首先复制该值。相反的情况是不可能的,因为本地对象在超出范围时会被销毁,但是您必须注意必须在范围内执行return语句,因此它必须在销毁之前发生。相反,在本地对象超出范围后,无法执行return语句。
从调用堆栈的角度来看,当堆栈开始展开时会破坏本地对象,但是在堆栈展开之前很久就会执行包含return语句的函数。这样可以确保在释放互斥锁之前复制m_name
。
或者想到这个简单的代码:
std::string f()
{
std::string s = "Nawaz";
return s; //Think of this line!
}
在销毁之后,s
是否复制了 1 ?这甚至可能吗?如果{<1}}在被破坏之后被复制,它是不是不可能在C ++中进行编程?
1。或者更好的说,移动。 : - )功能