首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >std::unique_lock<std::mutex>还是std::lock_guard<std::mutex>?

std::unique_lock<std::mutex>还是std::lock_guard<std::mutex>?
EN

Stack Overflow用户
提问于 2013-12-11 10:35:04
回答 7查看 219.1K关注 0票数 467

我有两个用例。

答:我想同步访问两个线程的队列。

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

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

两者之间有什么区别,我应该在哪种用例中使用哪一种?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-12-11 10:39:37

不同的是,您可以锁定和解锁一个std::unique_lockstd::lock_guard只在建筑上锁定一次,在破坏时解锁一次。

因此,对于用例B,条件变量肯定需要一个std::unique_lock。在A种情况下,这取决于你是否需要重新锁定警卫。

std::unique_lock还有其他允许它的特性,例如:在不立即锁定互斥锁的情况下构建它,但是可以构建RAII包装器(参见here)。

std::lock_guard还提供了一个方便的RAII包装器,但不能安全地锁定多个互斥对象。当您需要为有限的作用域使用包装器时,可以使用它,例如:成员函数:

代码语言:javascript
运行
复制
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

票数 451
EN

Stack Overflow用户

发布于 2013-12-11 10:41:08

lock_guardunique_lock几乎是一回事;lock_guard是一个受限版本,界面有限。

一个lock_guard总是持有一个锁从它的建设到它的破坏。可以在不立即锁定的情况下创建unique_lock,可以在其存在的任何点上解锁,并且可以将锁的所有权从一个实例转移到另一个实例。

因此,您总是使用lock_guard,除非您需要unique_lock的功能。condition_variable需要一个unique_lock

票数 160
EN

Stack Overflow用户

发布于 2013-12-11 10:39:03

使用lock_guard,除非您需要在不破坏lock的情况下手动地在互斥之间使用unlock

特别是,condition_variable在调用wait时打开它的互斥锁。这就是为什么lock_guard在这里是不够的。

如果您已经在使用C++17或更高版本,请考虑使用scoped_lock作为lock_guard的一个稍微改进的版本,具有相同的基本功能。

票数 67
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20516773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档