C++怎么使用std::lock()或std::scoped_lock获取多个mutex

本篇内容主要讲解“C++怎么使用std::lock()或std::scoped_lock获取多个mutex”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++怎么使用std::lock()或std::scoped_lock获取多个mutex”吧!

在石家庄等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站建设、成都网站制作 网站设计制作按需求定制开发,公司网站建设,企业网站建设,成都品牌网站建设,成都营销网站建设,外贸网站制作,石家庄网站建设费用合理。

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 lck1(m1);
lock_guard lck2(m2);

// thread 2
lock_guard lck2(m2);
lock_guard lck1(m1);

Instead, use lock():

使用lock代替:

// thread 1
lock(m1, m2);
lock_guard lck1(m1, adopt_lock);
lock_guard lck2(m2, adopt_lock);

// thread 2
lock(m2, m1);
lock_guard lck2(m2, adopt_lock);
lock_guard lck1(m1, adopt_lock);

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

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

// thread 1
scoped_lock lck1(m1, m2);

// thread 2
scoped_lock 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(注意)

在实际的代码中,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获取操作。这一点通常是不可判定的,但是捕捉一般的简单例子(例如上面的例子)是容易做到的。

到此,相信大家对“C++怎么使用std::lock()或std::scoped_lock获取多个mutex”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


网页题目:C++怎么使用std::lock()或std::scoped_lock获取多个mutex
链接分享:http://hbruida.cn/article/gcppod.html