2

試験問題:

リソースは、アクセスが先着順で行われるように、N個のスレッド間で共有されます。先着順のポリシーを実装する方法を説明します。

私の答えは次のようになります(注:コースはJavaベースです):

セマフォ(バイナリ)を使用して、共有リソースへのアクセスを制御します。次に、セマフォにアクセスするためのフィーダークラス/スレッドを作成します。フィーダースレッドはFIFOキューを使用して、先着順で実装します。セマフォが解放されると、スレッドとキューの先頭が共有リソースにアクセスできるようになります。

私は上記のアプローチを紙に書き留めたところですが、うまくいくようです。

質問は20点の質問で8点の価値があるので、満点の場合は使用new ReentrantLock(true)するだけで十分ではないかと思います。

皆さんはどう思いますか?

4

1 に答える 1

0

あなたの答えは本当に質問に対処していません。これは単にロックするだけでなく、リソースを待機しているスレッドをキューに入れることでもあります。

  • リソースを待っているスレッドをどのようにキューに入れますか?
  • リソースを待機しているスレッドがある場合、リソースを順番に消費するようにスレッドを起動するにはどうすればよいですか。
  • リソースを待機しているスレッドがある場合、それらが順番に実行されていることを確認し、新しいスレッドがリソースを取得する際の競合状態を回避するにはどうすればよいでしょうか。

考えられる解決策は、次のコードのようなものです。

  lockResource(resource);
  try {
     ... consume the resource
  } finally {
     unlockResource(resource);
  }

は次のlockResourceようになります。

  1. リソースのロックを取得します。
  2. long accessNumおよびを含むリソースに関連付けられたロック オブジェクトを取得しますlong runningNum
  3. 値をインクリメントaccessNumし、スレッドの結果を保存します。
  4. 値をチェックしlong runningNumて、 my に == かどうかを確認しますaccessNum
  5. == 鉱山の場合は、リソースのロックを解除して実行を続けます。
  6. キューに私よりも多くいる場合は、wait()リソースを使用してください。

unlockResource(...)呼び出されると、スレッドは次のことを行う必要があります。

  1. リソースをロックします。
  2. 設定running++
  3. 電話notifyAll()
  4. リソースのロックを解除

待機中のスレッドが起動した場合:

  1. かどうかを確認しますaccessNum == runningNum
  2. true の場合、リソースのロックを解除して実行を続行します
  3. そうでない場合は、に戻りますwait()
于 2012-10-10T13:49:16.630 に答える