2014-04-19 16 views
7

ile lock_guard kullanmak ve bu mekanizma boost::lock_guard kapsam dışına gider kez kilidi çıkacak belli olacak? Bu iseBen <code>boost::mutex</code> nesne üzerinde kilit elde etmeye <code>boost::lock_guard</code> kullanabilirsiniz try_lock_for

{ 
    boost::lock_guard<boost::mutex> lock(a_mutex); 
    // Do the work 
} 

dava, a_mutex bakılmaksızın kod bloğu istisna veya vermeyerek çıkıldı bakılmaksızın çıkacak. Ayrıca bir usul try_lock_for(period), örneğin destekleyen bir boost::timed_mutex Öte yandan

,

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) { 
    // Do the work 
    a_timed_mutex.unlock(); // <- This is needed! 
} else { 
    // Handle the acquisition failure 
} 

Bu kod olmaz unlock()if ifadesinin true blok bir istisna ile çıkıldı ise a_timed_mutex.

Soru: Boost (ve bildiğim kadarıyla gördüğünüz gibi, ne C++ 11 standart) try_lock() veya try_lock_for(period) ile çalışır lock_guard bir varyantını sunmak için görünmüyor. İkinci durumu ele almak için "önerilen" yol veya en iyi uygulama nedir?

cevap

10

Sen kilidi benimsemek için söylüyorum, kilitlendikten sonra kilit bekçi oluşturabilirsiniz:

if(a_timed_mutex.try_lock_for(boost::chrono::seconds(1))) { 
    boost::lock_guard<boost::mutex> lock(a_timed_mutex, boost::adopt_lock_t()); 
    // Do the work 
} else { 
    // Handle the acquisition failure 
} 

standart lock_guard da buna izin verir.

-1

dene unique_lock, unique_lock :: try_lock_for()

İlgili konular