Perbedaannya adalah bahwa Anda dapat mengunci dan membuka kunci a std::unique_lock
. std::lock_guard
akan dikunci hanya sekali pada konstruksi dan tidak terkunci pada kehancuran.
Jadi untuk kasus penggunaan B Anda pasti membutuhkan std::unique_lock
variabel kondisi. Dalam kasus A itu tergantung apakah Anda perlu mengunci kembali penjaga.
std::unique_lock
memiliki fitur lain yang memungkinkannya misalnya: dibangun tanpa mengunci mutex segera tetapi untuk membangun pembungkus RAII (lihat di sini ).
std::lock_guard
juga 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_guard
dan std::unique_lock
sama. Jadi dalam kasus di atas, Anda bisa menggantinya std::lock_guard
dengan std::unique_lock
. Namun, std::unique_lock
mungkin sedikit lebih mahal.
Perhatikan bahwa hari ini seseorang harus menggunakan std::scoped_lock
sebagai ganti std::lock_guard
.