避免死锁的方法

死锁不仅仅是在使用锁的时候发生(尽管这是最常见的),创建两个线程,在每个线程中调用对方的join函数,这时候也会造成死锁。两个线程都在等待对方先结束。避免死锁有一个最简单的原则:如果这个线程可能等待你,那么你就不要等待这个线程。

1、避免给一个锁嵌套上锁

在持有一个锁的时候,不要再给这个锁上锁。如果使用多个锁,使用std::lock。

2、在持有锁时,不要调用别人提供的函数

因为你不清楚别人的代码怎么实现的,不知道它是不是在使用锁。

3、给多个锁上锁时,固定顺序。

如果在给多个所上锁,并且无法使用std::lock,最好的做法就是在每一个线程中,都按照同样的顺序。

4、分层次来使用锁

把程序分成几个层次。区分每个层次中使用的锁,当一个线程已经持有更低层次的锁时,不允许使用高层次的锁。可以在程序运行时给不同的锁加上层次号,记录每个线程持有的锁。

时间: 2024-08-27 20:45:28

避免死锁的方法的相关文章

死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除

产生死锁的原因和必要条件: 产生死锁的原因: 1.竞争资源.当系统中供多个进程共享的资源如打印机,公用队列等,其数目不足以满足诸进程的需要时,会引起诸进程对资源的竞争而产生死锁. 2.进程推进顺序非法.进程在运行过程中,请求和释放资源的顺序不当,也同样会导致产生进程死锁. 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁.其次,进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个

SQLServer查看和解决死锁的方法

在master数据库中新建以下存储过程 --处理死锁-- 查看当前进程,或死锁进程,并能自动杀掉死进程-- 因为是针对死的,所以如果有死锁进程,只能查看死锁进程-- 当然,你可以通过参数控制,不管有没有死锁,都只查看死锁进程--调用示例 exec p_lockinfo create proc [dbo].[p_lockinfo]@kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉, 0 仅显示@show_spid_if_nolock bit=1 --如果没有死锁的进程,

sqlserver2008 死锁解决方法及性能优化方法

sqlserver2008 死锁解决方法及性能优化方法 原文: http://blog.csdn.net/kuui_chiu/article/details/48621939 十步优化SQL Server中的数据访问 http://tech.it168.com/a2009/1125/814/000000814758_2.shtml 关于死锁: [sql] view plain copy sp_who active  --看看哪个引起的死锁, blk里面即阻塞的spid: dbcc inputbu

Java多线程死锁避免方法

一.什么是死锁当两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的状态,由于存在一种环路的锁依赖关系而永远地等待下去,如果没有外部干涉,他们将永远等待下去,此时的这个状态称之为死锁.经典的 "哲学家进餐" 问题很好地描述了死锁状况:5个哲学家去吃中餐,坐在一张圆桌旁,他们有5根筷子(而不是5双),并且每两个人中间放一根筷子,哲学家们要么在思考,要么在进餐,每个人都需要一双筷子才能吃到东西,并在吃完后将筷子放回原处继续思考,有些筷子管理算法 (1) 能够使每个人都能相对

Java线程死锁解决方法(转)

转自:http://leowzy.iteye.com/blog/740859 Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成.假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭.他们都需要获得两个锁:共享

Java 查看死锁的方法

那我们怎么确定一定是死锁呢?有两种方法. 1>使用JDK给我们的的工具JConsole,可以通过打开cmd然后输入jconsole打开. 1)连接到需要查看的进程. 2)打开线程选项卡,然后点击左下角的“检测死锁” 3)jconsole就会给我们检测出该线程中造成死锁的线程,点击选中即可查看详情: 从上图中我们可以看出: ①在线程Thread-1中,从状态可以看出,它想申请Paper这个资源,但是这个资源已经被Thread-0拥有了,所以就堵塞了. ②在线程Thread-0中,从状态可以看出,它

数据库查询速度慢了?是否是因为死锁了?一种解决死锁的方法。

--查询哪些表被死锁 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' --查询后会返回一个包含spid和tableName列的表. --其中spid是进程名,tableName是表名. --查询主机名 exec sp_who2 'xxx' --xxx就是spid列的进程,检索

oracle死锁解决方法

select SESS.sid, SESS.SERIAL#, LO.ORACLE_USERNAME, LO.OS_USER_NAME,      AO.OBJECT_NAME, LO.LOCKED_MODEfrom V$LOCKED_OBJECT LO, DBA_OBJECTs AO, V$SESSION SESSwhere AO.OBJECT_ID = LO.OBJECT_IDand lo.session_id = sess.sid; alter system kill session '13

oracle死锁处理方法

招数一:    1. 查看被锁的表: 2.   select   p.spid,c.object_name,b.session_id,b.oracle_username,b.os_user_name   from   v$process   p,v$session   a,   v$locked_object   b,all_objects   c   where   p.addr=a.paddr   and   a.process=b.process   and   c.object_id=b