why scoped_lock is recommanded?app
注意,這不單單是說你可能忘記調用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(); ... }