2013-03-02 25 views
36

boost/thread/mutex.hpp adresinden boost::mutex kullanacağım. /kilit açma mutex'i kilitlemek için birkaç yol vardır: scoped_lock, unique_lock, lock_guard muteksi üye fonksiyonları ::lock() ve ::unlock() ve nonmember fonksiyonları lock() ve unlock() ile.boost scoped_lock vs düz kilitleme/kilit açma

Bu boost::scoped_mutex, mutex'i kullanmanın en popüler yollarından biri olduğunu farkettim. Neden üye işlevleri ::lock() ve ::unlock() tercih edilir?

Özellikle, neden

{ 
    boost::scoped_lock lock(mutex) 
    // ... 
    // read/output sharing memory. 
    // ... 
} 

yerine

mutex.lock() 
// ... 
// read/output sharing memory. 
// ... 
mutex.unlock() 

sırf görüş bazı stil kodlama noktasının daha iyi scoped_lock veya ::lock()/::unlock() değil "parçacığı yeterince güvenli" olandan

kullanmalıyım?

cevap

62

Neden üye işlevlerine tercih edilir :: lock() ve :: unlock()? RAII idiom genel olarak popüler oldu neden Aynı nedenle

(bu sadece sayısız örneklerinden biridir): Eğer don' muteksi kilitlemeden güncel kapsamını terk emin olabilirsiniz çünkü. Bu olmadığı

Bildirimi hemen unlock() aramaya unutmadan : Eğer arasında herhangi return açıklama yok olsa bile, sizin muteks kilitlenir ve unlock() için çağrı ulaşılabilir asla sırasında bir özel durumu oluşabilir senin lock() numaralı telefonu arayın ve unlock() numaralı telefonu arayın. Bu durumda

m.lock() // m is a mutex // ... foo(); // If this throws, your mutex won't get unlocked // ... m.unlock() 

, senin scoped_lock muhafız yıkıcı hep
Serbest bırakılıyor emin ilişkili mutex'i yapım yığını çekme sırasında çağrılır.

{ 
    boost::scoped_lock lock(m); // m is a mutex 
    // ... 
    foo(); // If this throws, your RAII wrapper will unlock the mutex 
    // ... 
} 

Üstelik bu kodun okunabilirliği artıracak birçok durumda, ki her return deyimi önce unlock() bir çağrı eklemek zorunda kalmazsınız. boost kitaplığı kullanmak istemiyorsanız

+0

Açık bir açıklama için teşekkür ederiz. – Max

+0

@Max: Yardım ettiğine sevindim –

2

Eğer

std::lock_guard<std::mutex> lock(mutex);

kullanabilirsiniz.