[英]Which will be executed first, RAII or function return value
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
之前是否會釋放互斥鎖?
版本2也是正確的(事實上,這比第一版更好 !)。
在通過本地對象的析構函數釋放互斥鎖之前,首先復制該值。 相反的情況是不可能的,因為本地對象在超出范圍時會被銷毀,但是您必須注意必須在范圍內執行return語句,因此它必須在銷毀之前發生。 相反,在本地對象超出范圍后,無法執行return語句。
從調用堆棧的角度來看,當堆棧開始展開時會破壞本地對象,但是在堆棧展開之前很久就會執行包含return語句的函數。 這確保在釋放互斥鎖之前復制m_name
。
或者想想這個簡單的代碼:
std::string f()
{
std::string s = "Nawaz";
return s; //Think of this line!
}
是s
其銷毀后復制1? 這甚至可能嗎? 如果在銷毀之后復制s
是不是不能用C ++編程?
或者更好的說, 感動 。 :-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.