2015-09-25 166 views

回答

0

让我们考虑4个线程(t0,t1,t2和t3)使用过滤器锁来获得互斥。

我们假设t0陷入0级,t1陷入1级,依此类推。因此t3进入其关键部分并在之后解锁。注意:t0到t2卡在while((∃k != i) level[k] >= L) && victim[L] == i) {};这实际上是几行代码(见Filter Lock Algorithm)。从现在开始,我将把这段代码称为(C1)。现在t2继续进入临界区并解锁,然后t1。这意味着t0可能会离开0级(C1)......但这并不意味着它不能被超越!现在t3,t2和t1很可能再次获得锁定。结果,三个线程中的一个被过滤掉并且停留在0级(C1),因为一个线程是“受害者”,比如说t1。当t0满足所有离开的要求(C1)时,它仍然可以在(C1)的for循环中,因为它可能由于各种体系结构原因而“运行得慢”。这允许t2和t3超过t0。