Sự khác biệt là bạn có thể khóa và mở khó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 hủy.
Vì vậy, đối với usecase B, bạn chắc chắn cần một std::unique_lock
cho biến điều kiện. Trong trường hợp A nó phụ thuộc vào việc bạn cần phải đóng lại bảo vệ.
std::unique_lock
có các tính năng khác cho phép, ví dụ: được xây dựng mà không khóa ngay lập tức nhưng để xây dựng trình bao bọc RAII (xem here).
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 mutex một cách an toàn. Nó có thể được sử dụng khi bạn cần một wrapper cho một phạm vi hạn chế, ví dụ .: Phải có chức năng 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 cách chmike, theo mặc định std::lock_guard
và std::unique_lock
đều 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ó thêm một chút chi phí.
Với lệnh std :: unique_lock lock (myMutex); mutex có bị khóa bởi hàm tạo không? –
chmike
@chmike Có, nó sẽ. Đã thêm một số làm rõ. – inf
Nếu tôi đang sử dụng trường hợp A, nó sẽ hiệu quả hơn khi sử dụng lock_gard thay vì unique_lock? – chmike