Aradaki fark, kilitleyip kilidini açabilmenizdir std::unique_lock
. std::lock_guard
inşaatta sadece bir kez kilitlenir ve yıkım sırasında kilidi açılır.
Bu nedenle, kullanım durumu B std::unique_lock
için koşul değişkeni için kesinlikle bir a ihtiyacınız vardır . A durumunda, korumayı yeniden kilitlemeniz gerekip gerekmediğine bağlıdır.
std::unique_lock
örneğin, muteksi hemen kilitlemeden, ancak RAII sargısını oluşturmak için inşa edilmesine izin veren başka özelliklere de sahiptir ( buraya bakın ).
std::lock_guard
ayrıca uygun bir RAII sarmalayıcı sağlar, ancak birden fazla muteksi güvenli bir şekilde kilitleyemez. Sınırlı bir kapsam için bir sargıya ihtiyacınız olduğunda kullanılabilir, örneğin: bir üye işlevi:
class MyClass{
std::mutex my_mutex;
void member_foo() {
std::lock_guard<mutex_type> lock(this->my_mutex);
/*
block of code which needs mutual exclusion (e.g. open the same
file in multiple threads).
*/
//mutex is automatically released when lock goes out of scope
};
Bir soruyu chmike ile açıklığa kavuşturmak için, varsayılan olarak std::lock_guard
ve std::unique_lock
aynıdır. Yani yukarıdaki durumda, std::lock_guard
ile değiştirebilirsiniz std::unique_lock
. Ancak, std::unique_lock
biraz daha fazla yük olabilir.
Bu günlerde std::scoped_lock
yerine kullanmak gerektiğini unutmayın std::lock_guard
.