c++在什么情境下使用固定顺序加锁无法解决死锁问题

发布于 2022-09-12 22:42:34 字数 261 浏览 25 评论 0

c++并发编程实战是这么介绍的:

当有多个互斥量保护同一个类的独立实例时,一个操作对同一个类的两个不同实例进行数据的交换操作,为了保证数据交换操作的正确性,就要避免数据被并发修改,并确保每个实例上的互斥量都能锁住自己要保护的区域。不过,选择一个固定的顺序(例如,实例提供的第一互斥量作为第一个参数,提供的第二个互斥量为第二个参数),可能会适得其反:在参数交换了之后,两个线程试图在相同的两个实例间进行数据交换时,程序又死锁了!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

盗梦空间 2022-09-19 22:42:34

假设有一个类型A:
A a;
A b;

有一个函数:
void a_swap(A& a,A& b) {
a.mut_.lock();
b.mut_.lock();
...
}

thread 1:
a_swap(a, b);

thread 2:
a_swap(b, a);

实际上死锁的产生和程序具体逻辑相关,很难用一种通用的业务逻辑无关的方法完全避免。

凉薄对峙 2022-09-19 22:42:34

例如 Swap(a, b) 需要访问需要同时访问 a、b 的内部数据,理所当然对 a、b 都加锁再访问,按常规思路首先对第一个参数加锁,然后对第二个参数加锁。但当两个线程同时分别调用 Swap(a, b) 和 Swap(b, a) 时,就又出现了上述的“两个线程试图通过不同的顺序获取多个相同的锁”的情况,就有可能发生死锁。

参考:https://kakarotto9.github.io/...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文