2012-02-29 32 views
12

據我所知,被boost::mutex::scoped_lock鎖定的變量在超出範圍時會自動解鎖。Boost線程的boost :: unique_lock作用域鎖嗎?

boost::unique_lock怎麼樣,當它超出範圍時它會自動解鎖變量嗎?

任何人都可以指出該功能的參考。

double x; 
boost::mutex x_mutex; 

void foo() 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(x_mutex); 
     x = rand(); 
    }  
    ...... some calculation which takes 10 second ...... 
    ...... is x still locked here??? ......  
} 

感謝。

+1

是的。該文檔在這裏:http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.locks.unique_lock – 2012-02-29 05:45:09

+1

如果析構函數沒有解鎖它,什麼時候會它曾經獲得解鎖? – 2012-02-29 05:50:41

+0

它的另一回合。 'boost :: mutex :: scoped_lock'是'unique_lock'的typedef。 http://www.boost.org/doc/libs/1_57_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_types.mutex – balki 2014-11-18 20:48:02

回答

12

scoped_lockunique_lock在mutex.hpp:

typedef unique_lock<mutex> scoped_lock; 

析構函數調用unlock()如果鎖被收購。所以,它會在超出範圍時釋放。

http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html

它不僅提供RAII風格鎖,它也允許推遲獲得鎖,直到鎖()成員函數顯式調用,或者試圖獲取一個鎖非阻塞時尚,或超時。因此,如果鎖對象鎖定了Lockable對象,或者在Lockable對象上採用了鎖,則僅在析構函數中調用unlock()。

+0

謝謝您的回覆。如果boost :: unique_lock在超出範圍時自動解鎖,那麼boost :: unique_lock和boost :: mutex :: scoped_lock之間有什麼區別?謝謝。 – 2607 2012-02-29 05:58:37

+0

也感謝您指出引用,但我在這裏有點困惑,是否意味着當超出範圍時自動調用析構函數? – 2607 2012-02-29 06:00:44

+5

'scoped_lock'是'unique_lock '的typedef。塊到達時自動聲明的變量在到達塊的末尾時被破壞,使[RAII模式](http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization)成爲可能。 – jspcal 2012-02-29 06:15:14