Разница в том, что вы можете заблокировать и разблокировать std::unique_lock
. std::lock_guard
будет заблокирован только один раз на строительстве и разблокирован при уничтожении.
Так что для варианта использования B вам определенно нужна std::unique_lock
переменная условия. В случае А это зависит от того, нужно ли вам снова заблокировать охрану.
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
.