簡體   English   中英

哪個將首先執行,RAII或函數返回值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM