实现一个lock的考虑

实现一个lock的基本要求是正确性,尽管做到这一点已经很不容易,但是我们还要考虑其他的问题:

1.       lock的公平性(fairness)要求。当有大量threads竞争一个lock时,我们应该考虑是不是有某些threads很难或永不可能获得lock,即所谓的starvation。但要注意:fairness不是一个“永远正确”的标准,因为在某些application中,我们恰恰要破坏这种fairness,以达成这个application特定的要求。

2.       尽量避免使thread进出kernel。一个thread为了lock进入kernel和返回的cost相对于lock所保护的code section的执行时间而言是不能被轻易忽略的,特别是当lock的竞争激烈时。所以Windows®的critical section的实现就使用了一个spincount。

3.       如果一个lock能在user mode中实现,就不要使用kernel resource,或者延迟kernel resource的分配。延迟分配也有缺点,例如:如果到了分配kernel resource的时候却发生了exception,此时,程序的错误处理就要复杂很多,很可能会造成无法挽回的损失。

4.       Re-entrance的支持问题。允许lock的这个特性的一个重要意义在于防止thread由于recursive locking而导致的deadlock。但是,一个lock也可以有自己的理由(如performance)不支持这个特性。

5.       预防使用lock时的典型错误。虽然这不是实现lock时主要的考虑目标,但是,这样做的好处对于一个通用的lock而言是不言而喻的。例如:防止一个thread没有获得(acquire)lock就进行释放(release)操作;检测一个thread还没有release一个lock就终止的问题。但是,一个lock出于自己的performance等考虑,可以忽略这些特性的实现,而把责任推给使用者(出于performance等的考虑,这样做是合理的)。

6.       不同thread priority导致的问题。这类问题是由于不同priority的threads使用同一个lock进行同步时。如果lock被允许这样使用,则不得不考虑这个问题,否则可能导致threads运行和调度时的公平原则(fairness)被破坏。

7. FIFO原则。一般情况下,一个lock释放后,下一个获得该lock的thread应该按照FIFO的原则来选择。但是,某个特定的lock为了某种原因,如performance等,可以破坏这个原则,如Windows® Vista之后的critical section。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值