前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++核心准则CP.21:使用std::lock()或者std::scoped_lock获取多个mutex

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

作者头像
面向对象思考
发布2020-07-03 17:14:42
1.5K0
发布2020-07-03 17:14:42
举报
文章被收录于专栏:C++核心准则原文翻译

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:

下面的代码会引发死锁:

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

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

代码语言:javascript
复制
// 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可以简单地这样写:

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CP.21: Use std::lock() or std::scoped_lock to acquire multiple mutexes
  • CP.21:使用std::lock()或者std::scoped_lock获取多个mutex
  • Reason(原因)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档