过滤器锁定互斥属性

时间:2013-08-07 17:56:16

标签: synchronization locking mutual-exclusion

以下是Peterson的2线程锁定算法的通用版本,允许'n'线程/进程竞争关键部分。

基本上有'n'级别和'n'个线程。在非关键部分区域中处于非活动状态或正在执行的线程处于级别0.级别n-1是关键部分。在进入临界区之前,每个线程/进程必须跨越n-1级。

有2个阵列,等级[n]&受害者[N]。第一个数组由线程的threadId索引,入口级[i]用threadId“i”存储线程的当前级别。第二个数组按级别编号索引,并且条目victim [i]存储最近线程的threadId以进入级别“i”。

level []的所有元素都被初始化为0.没有针对受害者[]的具体初始化。

1    void lock()
2    {  int me = ThreadID.get();
3       for (int i = 1; i < n; i++)
4       { level[me] = i;
5         victim[i] = me;
6         while ((∃k != me) (level[k] >= i && victim[i] == me)) ;
7       }
8    }
9   
10   void unlock()
11   {  int me = ThreadID.get();
12      level[me] = 0;
13   }

该代码是Maurice Herlihy和Nir Shavit出版的“多处理器编程艺术”一书中的直接副本。

问题是代码似乎不满足互斥属性!!

推理: - 第6行意味着,一个线程将保持循环一个级别,直到某个线程处于相同或更高级别,并且线程本身是最近进入其当前所在级别的线程。此外,仅一个线程可以保持在一个级别。如果第二个线程达到相同的级别,则'victim [i] == me'表达式将对第一个线程变为false,因此将被推送到下一个级别。

现在,如果每个级别都有一个线程,并且级别0的线程尝试前进到级别1.这会将级别1的线程推送到级别2,因为它不再是级别1的受害者。会有涟漪效应,每个线程都会被推下一个级别,导致n-2级的线程进入其关键部分!!

代码实际上是错误的还是我解释错了什么?

1 个答案:

答案 0 :(得分:0)

n是线程数,n是级别数 等级从0开始,n-1等级是关键部分

如果所有级别都填充了一个线程,则不会有任何其他线程进入第一级别0级。所以它永远不会发生。

例如,如果没有线程和级别数为3。 在开始时,所有线程都处于0级,2可以前进到下一级,并且必须根据条件等待 while((∃k!= me)(等级[k]&gt; = i&amp;&amp; victim [i] == me)); 并且从这两个线程中的一个进入第2级,这是关键部分。

现在每个级别都填充一个线程,只有可能的场景是关键部分中的线程调用unlock(),使其等级为0,然后只有其他线程可以继续。

point是等于级别数的线程数