Sự khác biệt là bạn có thể khóa và mở khóa a std::unique_lock
. std::lock_guard
sẽ chỉ bị khóa một lần khi xây dựng và mở khóa khi phá hủy.
Vì vậy, đối với trường hợp sử dụng B, bạn chắc chắn cần một std::unique_lock
biến điều kiện. Trong trường hợp A, nó phụ thuộc vào việc bạn có cần phải khóa lại người bảo vệ hay không.
std::unique_lock
có các tính năng khác cho phép nó, ví dụ: được xây dựng mà không khóa mutex ngay lập tức nhưng để xây dựng trình bao bọc RAII (xem tại đây ).
std::lock_guard
cũng cung cấp trình bao bọc RAII thuận tiện, nhưng không thể khóa nhiều mutexes một cách an toàn. Nó có thể được sử dụng khi bạn cần một trình bao bọc cho phạm vi giới hạn, ví dụ: hàm thành viên:
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
};
Để làm rõ một câu hỏi bằng chmike, theo mặc định std::lock_guard
và std::unique_lock
giống nhau. Vì vậy, trong trường hợp trên, bạn có thể thay thế std::lock_guard
bằng std::unique_lock
. Tuy nhiên, std::unique_lock
có thể có một chút chi phí.
Lưu ý rằng những ngày này nên sử dụng std::scoped_lock
thay vì std::lock_guard
.