首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有序锁模式与ReaderWriterLock在C#中的应用

有序锁模式与ReaderWriterLock在C#中的应用
EN

Stack Overflow用户
提问于 2011-01-20 17:16:11
回答 3查看 613关注 0票数 0

当与ReaderWriterLock (或ReaderWriterLockSlim)一起使用时,有序锁定模式是否防止死锁?

显然,这种模式可以防止使用互斥锁的死锁。如果我用(有读取锁的N个资源)和(有写锁的1或2个资源)锁定多个资源,它是否仍然防止死锁。

例如:(粗体数字表示具有写锁的资源)

1 2 3 4 5

2 3 4

1 4 5

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-09 13:37:07

dr资源排序也防止了读写器锁的死锁。

较长的答覆:

绘制这样的等待图:

首先,按照规定的顺序为从左到右的所有资源绘制一个顶点。

然后,对于等待资源的每个进程,在等待资源的顶点之前绘制一个顶点。如果一个进程没有等待任何资源,那么在所有资源顶点之后,在最右边绘制一个顶点。

然后从每个进程绘制一个边缘到该进程正在等待的资源,并从每个资源到当前持有该资源的进程绘制一个边缘。

考虑图上的每一条边。有两种情况:

  • 边是Pi -> Ri,即从一个进程到一个资源。由于每个进程只在一个资源上等待,并且我们已经将进程的顶点立即绘制到它等待的资源的左边,那么边是从左到右的。
  • 边是Ri -> Pj,也就是从一个资源到一个进程。如果Pj没有等待任何资源,那么它的顶点位于所有资源的右边,因此边是从左到右的。如果Pj正在等待Rk,那么i < k,因为进程按顺序获取资源。如果是i < k,那么RiRk的左边,Pj就在Rk的左边(因为我们已经画了笔画),所以RiPj的左边,因此边缘再次从左到右。

由于用这种方式绘制的图的所有边都是从左到右的,所以我们构造了图的拓扑排序,因此图没有圈,因此不会出现死锁。

注意,重要的是进程等待的事实(),而不是为什么等待。因此,不管它是等待互斥、读-写锁、信号量还是其他什么,这种防止死锁的策略对所有人都有效。

票数 1
EN

Stack Overflow用户

发布于 2011-01-20 17:29:04

我认为你做错了顺序锁定模式,你必须把所有的锁按顺序抓取。要抓取"4“的写锁,首先需要抓取"3”的写锁。对于"5",您需要抓取"3“、"4”和"5“的写锁。

对于普通的锁,有序的锁模式是昂贵的,但是对于SRW锁,它们非常昂贵,因为您必须首先丢弃所有的读取器。记住,只有在访问的80%+不需要写锁的情况下,SRW锁才是一种优势--否则它非常昂贵,而且使用简单的锁可以做得更好。

更好的是,尝试将代码解耦,这样您就不需要有序的锁定(也就是说,我不需要同时访问来自'3‘和'4’的数据)。这并不总是可能的,但是您的代码将越简单,您就越能做到这一点。

票数 0
EN

Stack Overflow用户

发布于 2013-03-19 03:34:06

我尝试在C#中实现有序锁,检查锁是否是按固定顺序获得的。请参阅http://www.codeproject.com/Tips/563154/OrderedLock-in-Csharp

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4750304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档