我有两个用例。
A.我想同步访问两个线程的队列。
B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。
对于用例 A,我看到了使用 std::lock_guard<>
的代码示例.对于用例 B,我看到了使用 std::unique_lock<>
的代码示例.
这两者有什么区别,我应该在哪个用例中使用哪一个?
不同之处在于您可以锁定和解锁 std::unique_lock
。 std::lock_guard
只会在构造时锁定一次,在销毁时解锁。
所以对于用例 B,你肯定需要一个 std::unique_lock
作为条件变量。情况 A 取决于您是否需要重新锁定防护装置。
std::unique_lock
具有其他特性,例如:在不立即锁定互斥锁的情况下构建,而是构建 RAII 包装器(参见 here)。
std::lock_guard
还提供了方便的 RAII 包装器,但不能安全地锁定多个互斥锁。当您需要有限范围的包装器时可以使用它,例如:成员函数:
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
}
};
为了澄清 chmike 的问题,默认情况下 std::lock_guard
和 std::unique_lock
是相同的。因此,在上述情况下,您可以将 std::lock_guard
替换为 std::unique_lock
。但是,std::unique_lock
可能会有更多开销。
请注意,现在(从 C++17 开始)人们应该使用 std::scoped_lock
而不是 std::lock_guard
。
我是一名优秀的程序员,十分优秀!