2025年C++核心准则CP.21-使用std--lock()或者std--scoped_lock获取多个mutex

C++核心准则CP.21-使用std--lock()或者std--scoped_lock获取多个mutexCP 21 Use std lock or std scoped lock to acquire multiple mutexes CP 21 使用 std lock 或者 std scoped lock 获取多个 mutex Reason 原因 To avoid deadlocks on multiple mutexes

大家好,我是讯享网,很高兴认识大家。

CP.21: Use std::lock() or std::scoped_lock to acquire multiple mutexes

CP.21:使用std::lock()或者std::scoped_lock获取多个mutex

 

Reason(原因)

To avoid deadlocks on multiple mutexes.

避免在多个mutex上发生死锁。

 

Example(实例)

This is asking for deadlock:

下面的代码会引发死锁:

// thread 1 lock_guard<mutex> lck1(m1); lock_guard<mutex> lck2(m2); // thread 2 lock_guard<mutex> lck2(m2); lock_guard<mutex> lck1(m1); 

讯享网

Instead, use lock():

使用lock代替:

讯享网// thread 1 lock(m1, m2); lock_guard<mutex> lck1(m1, adopt_lock); lock_guard<mutex> lck2(m2, adopt_lock); // thread 2 lock(m2, m1); lock_guard<mutex> lck2(m2, adopt_lock); lock_guard<mutex> lck1(m1, adopt_lock); 

or (better, but C++17 only):

或者(可以更好,但仅限于C++17)

// thread 1 scoped_lock<mutex, mutex> lck1(m1, m2); // thread 2 scoped_lock<mutex, mutex> lck2(m2, m1); 

Here, the writers of thread1 and thread2 are still not agreeing on the order of the mutexes, but order no longer matters.

这里,thread1和thread2的作者仍然没有在获取mutex的顺序上取得一致,但是顺序已经不再重要。

 

Note(注意)

In real code, mutexes are rarely named to conveniently remind the programmer of an intended relation and intended order of acquisition. In real code, mutexes are not always conveniently acquired on consecutive lines.

在实际的代码中,mutex的命名很少能向程序员提示希望的关系和希望的请求次序。在实际的代码中,mute不会总是在相邻代码中执行获取,那样的话问题可能更容易被发现。

 

In C++17 it's possible to write plain


讯享网

在C++17可以简单地这样写:

讯享网lock_guard lck1(m1, adopt_lock); 

and have the mutex type deduced.

这样就可以实现mutex类型推断。

 

Enforcement(实施建议)

Detect the acquisition of multiple mutexes. This is undecidable in general, but catching common simple examples (like the one above) is easy.

检查多重mutex获取操作。这一点通常是不可判定的,但是捕捉一般的简单例子(例如上面的例子)是容易做到的。

 

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#cp21-use-stdlock-or-stdscoped_lock-to-acquire-multiple-mutexes


 

新书介绍

以下是本人3月份出版的新书,拜托多多关注!

 

本书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。

对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。

 

觉得本文有帮助?欢迎点赞并分享给更多的人。

阅读更多更新文章,请关注微信公众号【面向对象思考】

小讯
上一篇 2025-03-13 18:27
下一篇 2025-02-10 11:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/55572.html