Multithreading 哈密瓜大学科学家设计的快速路径锁定算法正确吗?
目前,我正在阅读Multithreading 哈密瓜大学科学家设计的快速路径锁定算法正确吗?,multithreading,Multithreading,目前,我正在阅读,我对它的练习15(第42页)感到困惑,这是关于快速路径算法的,这是哈密瓜大学的科学家们设计的,我认为它是错的…(但它实际上是对的!),有人能帮我理解吗 练习15。 实际上,几乎所有锁的获取都是无争用的,因此衡量锁性能的最实际的方法是当没有其他线程同时尝试获取锁时,线程获取锁所需的步数。哈密瓜大学的科学家为任意锁设计了如下“包装器”,如图2.16所示。他们声称,如果基锁类提供互斥且无饥饿,则FastPath锁也是如此,但它可以在缺少内容的情况下通过固定的步骤获得。请简述他们的观点
,我对它的练习15(第42页)
感到困惑,这是关于快速路径算法的,这是哈密瓜大学的科学家们设计的,我认为它是错的…(但它实际上是对的!),有人能帮我理解吗
练习15。
实际上,几乎所有锁的获取都是无争用的,因此衡量锁性能的最实际的方法是当没有其他线程同时尝试获取锁时,线程获取锁所需的步数。哈密瓜大学的科学家为任意锁设计了如下“包装器”,如图2.16所示。他们声称,如果基锁类提供互斥且无饥饿,则FastPath锁也是如此,但它可以在缺少内容的情况下通过固定的步骤获得。请简述他们的观点,或者给出反例
伪码
1。类FastPath实现锁{
2.私有静态ThreadLocal myIndex;//ThreadLocal,线程局部变量,只能被当前线程读写
3.私家锁;//谁在那里
4.私有整数x,y=-1;
5.公共无效锁(){
6.int i=myIndex.get();
7.x=i;//我在这里
8.当(y!=-1){}//锁是空闲的吗?
9.y=i;//又是我吗?
10.如果(x!=i)//我还在这里吗?
11.lock.lock();
12. }
13
14.公共无效解锁({
15.y=-1;
16.锁定。解锁();
17. }
18
}
以下是我的假设:
- 情景1
只有一个线程A
,因为简单地说,我使用线程的TID
而不是myIndex,那么A最终可以进入CS,而无需调用lock.lock()
,因为第11行中的条件在10行中失败。这看起来很奇怪,但是可以工作,因为A可以在线性时间
中输入CS,而无需调用锁(),这正是快速路径算法的目的
- 情景2
系统中总共有3个线程。假设C
现在已经在CS中,并且A、B分别请求CS(A在B前面)。现在,系统中变量的值是:
//在A的处理中
i=A的TID;
//在B的处理中
i=B的TID;
//假设A比B快一点,那么
x=B的TID;//因为A在B前面,所以x被B覆盖
y=C的TID;//因为C已经在CS中,所以y=C的TID
现在A和B都被阻塞在第8行。假设C正在离开CS。然后y=-1
。A和B都可以通过第八行瞬时值,则系统中变量的值为:
x=B的TID;//无变化
y=B的TID;//原因A是前B。
//在A的处理过程中
i=A的TID;
//在B的处理中
i=B的TID;
所以在B的处理中,x=如果i为false,则B可以直接输入CS,而不使用lock.lock()
,在A的处理中,x=i为true
,则A可以在调用lock.lock()后进入CS。这不是相互妥协
谁能告诉我哪里错了。真的谢谢
我明白了…,这个算法实际上是完全错误的…,我的分析是正确的。这本书是否规定该算法可以处理2个以上的锁定线程?不,这是一个练习,但我认为基于它的完整描述,它适合N个锁定线程。(我在问题中做了完整的描述,另外,谢谢你的回答)。