1

ロック ツリーのデッドロック検出アルゴリズムのいくつかの例に取り組んできましたが、この特定の状況でデッドロックがどのように発生するかを理解できませんでした。

Thread 1:           Thread 2:

lock(A)             lock(E)
lock(C)             lock(D)
unlock(C)           unlock(D)
lock(B)             unlock(A)
lock(D)             lock(A)
lock(E)             lock(C)
unlock(E)           unlock(C)
unlock(D)           unlock(A)
unlock(B)
unlock(A)

私の理解では、ロック ツリーは次のようになります。

  T1:          T2:
              /  \
  A          E    A
 / \         |    |
C   B        D    C
    |
    D
    | 
    E

ノード T1: D - E および T2: E - D でデッドロックが発生する可能性があります。これは、スレッドがこれらのロックを逆の順序で取得するためでしょうか?

デッドロックを取り除くために、1 つの lock ステートメントと 1 つの unlock ステートメントを挿入することをどのように提案できますか?

4

2 に答える 2

2

はい、T2 で lock(E) の前に lock(B) を実行すると、デッドロックが回避されます。これをゲートロックといいます。

于 2012-10-30T21:17:49.337 に答える
1

スレッド 1 が行うこと: lock(a)、lock(c)、unlock(c)、lock(b)、lock(d)

これで a、b、d がロックされました

スレッド 2 が行うこと: lock(e)、lock(d)

そのため、e もロックされ、スレッド 2 は d がロック解除されるのを待っています。

スレッド 1 が起動し、次のことを行います: lock(e)

今、彼らは立ち往生しています -

1 は 2 がロックを解除するのを待っています e.

2 は 1 がロックを解除するのを待っています d

これを回避する方法の 1 つは、個別の操作としてではなく、必要なものすべてを一度にロックすることです。

于 2012-08-12T18:04:53.267 に答える