不要被死锁吓死

2024-02-03 20:58
文章标签 死锁 不要 吓死

本文主要是介绍不要被死锁吓死,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天跑步的时候,想起前一阵被问到的死锁问题还没有好好的看过,刚好简书上有一篇比较细致的文章,这里做下总结.

文章链接:

https://www.jianshu.com/p/cab2fbc4b794

总结:

1.这里死锁产生的原因,线程t1等待t2释放mtB,而线程t2等待t1释放mtA.

2.死锁解决的办法:让这两个互斥量同时上锁,然后通过adopt_lock参数来在后面能够正确释放.

ps:一个官方的例子

:https://zh.cppreference.com/w/cpp/thread/lock_tag

//为什么需要采用两个互斥量,不可以使用一个互斥量,然后在函数最开始进行加锁,然后在函数结束时进行解锁码??
#include <mutex>
#include <thread>
#include<iostream>
using namespace std; struct bank_account {explicit bank_account(int balance) : balance(balance) {}int balance;std::mutex m;
};void transfer(bank_account &from, bank_account &to, int amount)
{// 锁定两个互斥而不死锁std::lock(from.m, to.m);// 保证二个已锁定互斥在作用域结尾解锁std::lock_guard<std::mutex> lock1(from.m, std::adopt_lock);std::lock_guard<std::mutex> lock2(to.m, std::adopt_lock);// 等价方法:
//    std::unique_lock<std::mutex> lock1(from.m, std::defer_lock);
//    std::unique_lock<std::mutex> lock2(to.m, std::defer_lock);
//    std::lock(lock1, lock2);from.balance -= amount;to.balance += amount;
}int main()
{bank_account my_account(100);bank_account your_account(50);std::thread t1(transfer, std::ref(my_account), std::ref(your_account), 10);std::thread t2(transfer, std::ref(your_account), std::ref(my_account), 5);t1.join();t2.join();cout << "my_account:" << my_account.balance << endl;cout << "your_account:" << your_account.balance << endl;   
}

这篇关于不要被死锁吓死的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/675399

相关文章

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误

C#多线程编程中导致死锁的常见陷阱和避免方法

《C#多线程编程中导致死锁的常见陷阱和避免方法》在C#多线程编程中,死锁(Deadlock)是一种常见的、令人头疼的错误,死锁通常发生在多个线程试图获取多个资源的锁时,导致相互等待对方释放资源,最终形... 目录引言1. 什么是死锁?死锁的典型条件:2. 导致死锁的常见原因2.1 锁的顺序问题错误示例:不同

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

模具要不要建设3D打印中心

随着3D打印技术的日益成熟与广泛应用,模具企业迎来了自建3D打印中心的热潮。这一举措不仅为企业带来了前所未有的发展机遇,同时也伴随着一系列需要克服的挑战,如何看待企业引进增材制造,小编为您全面分析。 机遇篇: 加速产品创新:3D打印技术如同一把钥匙,为模具企业解锁了快速迭代产品设计的可能。企业能够迅速将创意转化为实体模型,缩短产品从设计到市场的周期,抢占市场先机。 强化定制化服务:面

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁? ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大

大家不要退小黄车的押金了

大家好,首先我不是ofo的任何人,我只是一名小黄车的使用者,从去年开始就一直关注这ofo、摩拜的信息,最近这段时间ofo陷入了囧境,大家都担心自己的押金,全都去退还押金,这样无疑是给ofo有一层打击,因为本来资金已经很紧张了,ofo的用户也不在少数,没有资本的涌入,它也挺可怜的,它去哪里给你们退钱呢。           ofo的诞生,给我们提供了方便我们是毋庸置疑的,不光是

模拟线程死锁——Thread学习笔记

记录一下之前写过的一段模拟死锁的代码: /*** 模拟死锁** @author lixiang* @date 2018年10月12日 - 9:51* @history 2018年10月12日 - 9:51 lixiang create.*/public class HoldLockDemo {private static Object[] lock = new Object[10];priv