2009-11-17 236 views
6

兩個代碼示例是否低於等效?互斥鎖和鎖

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ProcessHandle::PID pid = 0; 
    mMutex.lock(); 
    pid = mPID; 
    mMutex.unlock(); 
    return pid; 
} 

Poco::ProcessHandle::PID ProcessRunner::processId() const 
{ 
    Poco::ScopedLock<Poco::Mutex> lock(mMutex); 
    return mPID; 
} 
  • 在第二個示例:將鎖超出範圍的返回值複製已成功完成後?如果返回的對象有很多複製指令,這會很重要。
  • 如果只打算返回一個int值,那麼是否需要鎖定?或者是int的複製是一個原子操作?

回答

8

它們是等價的。直到他們的塊的最後一行被執行後,當地人纔會離開範圍。所以在這種情況下,返回值副本是在鎖的保護下進行的。

3

如果Poco的ScopedLock能夠像Boost的lock_guard那樣工作並且PID分配不能拋出異常,那麼對第一個問題的回答就是肯定的。這個ScopedLock的目的是防止死鎖。即使發生異常,您也不能忘記解鎖互斥鎖。即使你「只讀取一些數據」,你是否需要鎖定?那麼,在這種情況下(僅訪問一個int)是一種灰色區域(最好不要這樣做),但是一般情況下,如果您只是讀取數據,也會鎖定互斥鎖。

+0

我更關心操作的原子性。代碼示例2中首先發生的是:返回值的副本或鎖的銷燬?如果這不是第一個,那麼它是錯誤的代碼。 – StackedCrooked 2009-11-17 20:49:21

+0

據我所知,首先返回值是「構造」,然後所有的自動對象被破壞。 – sellibitze 2009-11-17 20:50:41

+0

我剛剛意識到,如果一個函數返回一個局部變量,它必須在破壞它之前將其複製。衛生署。 – StackedCrooked 2009-11-17 20:54:06