并发编程中的锁算法与时间戳系统详解
1. 过滤器锁算法的死锁问题
在并发编程中,过滤器锁算法是一个重要的概念。当存在两个线程 A 和 B 时,若它们卡在某一级别 j,且 victim[j] 字段不变,由于它不能同时等于 A 和 B,所以必然有一个线程能进入级别 j + 1,这就使得卡住的线程数量减少到 k - 1,这与归纳假设相矛盾。由此得出推论:过滤器锁算法是无死锁的。
2. 锁的公平性
无饥饿属性保证了每个调用 lock() 方法的线程最终都能进入临界区,但它并未对所需时间做出保证。理想情况下,如果线程 A 先于线程 B 调用 lock() 方法,那么 A 应该先进入临界区。然而,我们难以直接判断哪个线程先调用了 lock() 方法。因此,我们将 lock() 方法拆分为两个代码部分:
- 门道部分(doorway section) :其执行区间 DA 由有限步骤组成。
- 等待部分(waiting section) :其执行区间 WA 可能需要无限步骤。
门道部分必须在有限步骤内完成,这一要求被称为有界无等待进展属性。公平性的定义如下:若线程 A 在 B 开始门道部分之前完成了自己的门道部分,那么 A 不会被 B 超越。用数学表达式表示为:若 $D_{j}^{A} \to D_{k}^{B}$,则 $CS_{j}^{A} \to CS_{k}^{B}$。
3. Lamport 的面包店算法
面包店锁算法通过模拟面包店的号码分发机来维护先来先服务的属性。每个线程在门道部分获取一个号码,然后等待,直到没有比它号码更小
超级会员免费看
订阅专栏 解锁全文
170万+

被折叠的 条评论
为什么被折叠?



