Sự khác biệt là bạn có thể khóa và mở khóa a std::unique_lock. std::lock_guardsẽ 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_lockbiế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_lockcó 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_guardcũ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_guardvà std::unique_lockgiống nhau. Vì vậy, trong trường hợp trên, bạn có thể thay thế std::lock_guardbằng std::unique_lock. Tuy nhiên, std::unique_lockcó 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_lockthay vì std::lock_guard.