【问题标题】:Filter Lock Algorithm过滤器锁定算法
【发布时间】:2013-11-11 15:13:30
【问题描述】:

我正忙于研究 n 线程互斥的过滤器锁定算法,我似乎无法理解代码的第 17 行。我知道它在一个条件下旋转,但不完全确定这些条件是什么。更具体地说, (∃k != me) 意味着什么。

1 class Filter implements Lock {
2 int[] level;
3 int[] victim;
4 public Filter(int n) {
5     level = new int[n];
6     victim = new int[n]; // use 1..n-1
7     for (int i = 0; i < n; i++) {
8         level[i] = 0;
9     }
10 }
11 public void lock() {
12     int me = ThreadID.get();
13     for (int i = 1; i < n; i++) { //attempt level 1
14     level[me] = i;
15     victim[i] = me;
16     // spin while conflicts exist
17     while ((∃k != me) (level[k] >= i && victim[i] == me)) {};
18     }
19 }
20 public void unlock() {
21     int me = ThreadID.get();
22     level[me] = 0;
23 }
24 }

【问题讨论】:

    标签: java algorithm concurrency locking


    【解决方案1】:

    我的阅读

    (∃k != me) (level[k] >= i && victim[i] == me)
    

    是“存在一些k而不是me,例如level[k] &gt;= i &amp;&amp; victim[i] == me”。

    循环旋转直到没有满足条件的k

    这里有另一种说法:

    boolean conflicts_exist = true;
    while (conflicts_exist) {
       conflicts_exist = false;
       for (int k = 1; k < n; k++) {
          if (k != me && level[k] >= i && victim[i] == me) {
             conflicts_exist = true;
             break;
          }
       }
    }
    

    【讨论】:

    • 我只是不确定 k 出现在哪里,或者更具体地说,k 是在哪里定义的
    • @Crossman:您可以将其视为二级循环,k 是循环变量。请参阅我的编辑。希望这能让事情更清楚。
    • 很明显,你的算法有错误。 k 应该从 0 而不是 1 开始。否则,如果有两个线程,那么线程 2 永远不会知道,线程 1 已准备好获取锁。
    【解决方案2】:

    可以写成:

    for (int k = 0; k < n; k++) {
          while ((k != me) && (level[k] >= i && victim[i] == me)) {
               //spin wait
          }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2016-10-31
      • 2010-10-19
      • 2015-07-14
      • 1970-01-01
      相关资源
      最近更新 更多