Perbedaannya adalah bahwa Anda dapat mengunci dan membuka kunci a std::unique_lock. std::lock_guardakan dikunci hanya sekali pada konstruksi dan tidak terkunci pada kehancuran.
Jadi untuk kasus penggunaan B Anda pasti membutuhkan std::unique_lockvariabel kondisi. Dalam kasus A itu tergantung apakah Anda perlu mengunci kembali penjaga.
std::unique_lockmemiliki fitur lain yang memungkinkannya misalnya: dibangun tanpa mengunci mutex segera tetapi untuk membangun pembungkus RAII (lihat di sini ).
std::lock_guardjuga menyediakan pembungkus RAII yang nyaman, tetapi tidak dapat mengunci beberapa mutex dengan aman. Ini dapat digunakan ketika Anda membutuhkan pembungkus untuk lingkup terbatas, misalnya: fungsi anggota:
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
};
Untuk mengklarifikasi pertanyaan dengan chmike, secara default std::lock_guarddan std::unique_locksama. Jadi dalam kasus di atas, Anda bisa menggantinya std::lock_guarddengan std::unique_lock. Namun, std::unique_lockmungkin sedikit lebih mahal.
Perhatikan bahwa hari ini seseorang harus menggunakan std::scoped_locksebagai ganti std::lock_guard.