boost -- scoped_lock V.S. mutex lock/unlock —— why scoped_lock is recommanded?

why scoped_lock is recommanded?app

 

其實,這和RAII idiom變流行是同樣的緣由:由於你能夠確保任何狀況下離開執行範圍都會解鎖mutex。

注意,這不單單是說你可能忘記調用unlock():而且,在你的mutex被鎖定以後,程序還有可能拋出異常,你寫的unlock調用語句有可能永遠沒有機會執行,即便在lock()unlock()之間沒有返回語句也同樣。 函數

 

m.lock() // m 是一個 mutex
// ...
foo(); // 若是這函數裏面throw up了, 你的mutex 就會永遠鎖住了
// ...
m.unlock()

 

像下面這樣你的scoped_lock 的析構函數總會在棧展開的時候自動調用,這樣就能確保關聯的mutex老是被釋放了。ui

{
    boost::scoped_lock lock(m); // m 是一mutex
    // ...
    foo(); // 若是throw up了,你的 RAII wrapper會解鎖 mutex
    // ...
}

 

除此以外這樣還能增長你的代碼的可讀性。你不須要在每一個返回語句前面加一句unlock。spa

 

==============code

當你要鎖的函數是遞歸函數時,你能夠用boost::recursive_mutex + boost::recursive_mutex::scoped_lock blog

void foo() {
   ... mutex_acquire();
   ... foo();
   ... mutex_release();
}

 

不用 recursive mutex的話就得這樣:遞歸

void foo_entry() {
   mutex_acquire(); 
   foo(); 
   mutex_release(); 
}

void foo() { ... foo(); ... }
相關文章
相關標籤/搜索