实现一个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。