Різниця полягає в тому, що ви можете заблокувати та розблокувати a std::unique_lock
. std::lock_guard
буде заблокований лише один раз на конструкції та розблокований при знищенні.
Тому для використання випадку B вам обов'язково потрібна std::unique_lock
змінна умова. У випадку A, це залежить від того, чи потрібно вимкнути охорону.
std::unique_lock
має і інші функції , які дозволяють йому , наприклад: бути побудований без негайного блокування мьютекса , але будувати RAII оболонку (див тут ).
std::lock_guard
також забезпечує зручну оболонку RAII, але не може безпечно заблокувати кілька файлів. Його можна використовувати, коли вам потрібна обгортка для обмеженої області, наприклад: функція члена:
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
};
Для того, щоб прояснити питання по chmike, за замовчуванням std::lock_guard
і std::unique_lock
є однаковими. Тож у наведеному вище випадку ви можете замінити std::lock_guard
на std::unique_lock
. Однак, std::unique_lock
можливо, більше, ніж накладні.
Зауважте, що в ці дні слід використовувати std::scoped_lock
замість цього std::lock_guard
.