gpt4 book ai didi

c++ - std::unique_lock 还是 std::lock_guard

转载 作者:bug小助手 更新时间:2023-10-28 01:31:55 29 4
gpt4 key购买 nike

我有两个用例。

A.我想同步访问两个线程的队列。

B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。

对于用例 A,我看到了使用 std::lock_guard<> 的代码示例.对于用例 B,我看到了使用 std::unique_lock<> 的代码示例.

这两者有什么区别,我应该在哪个用例中使用哪一个?

最佳答案

不同之处在于您可以锁定和解锁 std::unique_lockstd::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_guardstd::unique_lock 是相同的。因此,在上述情况下,您可以将 std::lock_guard 替换为 std::unique_lock。但是,std::unique_lock 可能会有更多开销。

请注意,现在(从 C++17 开始)人们应该使用 std::scoped_lock而不是 std::lock_guard

关于c++ - std::unique_lock<std::mutex> 还是 std::lock_guard<std::mutex>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20516773/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com