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 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?欢迎点赞并分享给更多的人。
阅读更多更新文章,请关注微信公众号【面向对象思考】

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