当与ReaderWriterLock (或ReaderWriterLockSlim)一起使用时,有序锁定模式是否防止死锁?
显然,这种模式可以防止使用互斥锁的死锁。如果我用(有读取锁的N个资源)和(有写锁的1或2个资源)锁定多个资源,它是否仍然防止死锁。
例如:(粗体数字表示具有写锁的资源)
1 2 3 4 5
2 3 4
1 4 5
发布于 2011-11-09 13:37:07
dr资源排序也防止了读写器锁的死锁。
较长的答覆:
绘制这样的等待图:
首先,按照规定的顺序为从左到右的所有资源绘制一个顶点。
然后,对于等待资源的每个进程,在等待资源的顶点之前绘制一个顶点。如果一个进程没有等待任何资源,那么在所有资源顶点之后,在最右边绘制一个顶点。
然后从每个进程绘制一个边缘到该进程正在等待的资源,并从每个资源到当前持有该资源的进程绘制一个边缘。
考虑图上的每一条边。有两种情况:
Pi -> Ri,即从一个进程到一个资源。由于每个进程只在一个资源上等待,并且我们已经将进程的顶点立即绘制到它等待的资源的左边,那么边是从左到右的。Ri -> Pj,也就是从一个资源到一个进程。如果Pj没有等待任何资源,那么它的顶点位于所有资源的右边,因此边是从左到右的。如果Pj正在等待Rk,那么i < k,因为进程按顺序获取资源。如果是i < k,那么Ri在Rk的左边,Pj就在Rk的左边(因为我们已经画了笔画),所以Ri在Pj的左边,因此边缘再次从左到右。由于用这种方式绘制的图的所有边都是从左到右的,所以我们构造了图的拓扑排序,因此图没有圈,因此不会出现死锁。
注意,重要的是进程等待的事实(),而不是为什么等待。因此,不管它是等待互斥、读-写锁、信号量还是其他什么,这种防止死锁的策略对所有人都有效。
发布于 2011-01-20 17:29:04
我认为你做错了顺序锁定模式,你必须把所有的锁按顺序抓取。要抓取"4“的写锁,首先需要抓取"3”的写锁。对于"5",您需要抓取"3“、"4”和"5“的写锁。
对于普通的锁,有序的锁模式是昂贵的,但是对于SRW锁,它们非常昂贵,因为您必须首先丢弃所有的读取器。记住,只有在访问的80%+不需要写锁的情况下,SRW锁才是一种优势--否则它非常昂贵,而且使用简单的锁可以做得更好。
更好的是,尝试将代码解耦,这样您就不需要有序的锁定(也就是说,我不需要同时访问来自'3‘和'4’的数据)。这并不总是可能的,但是您的代码将越简单,您就越能做到这一点。
发布于 2013-03-19 03:34:06
我尝试在C#中实现有序锁,检查锁是否是按固定顺序获得的。请参阅http://www.codeproject.com/Tips/563154/OrderedLock-in-Csharp
https://stackoverflow.com/questions/4750304
复制相似问题