以下是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级的线程进入其关键部分!!
代码实际上是错误的还是我解释错了什么?
答案 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是等于级别数的线程数