1

スレッドt1、t2、t3 ...... t10があり、プリンターとスキャナーにアクセスする必要があるとします。順序は最初にスキャンしてから、このスレッドを使用して印刷するので、t1、t2 ... t10(複数のユーザーによる)デッドロックなしでスキャナーまたはプリンターにアクセスできます。

t1はスキャンとプリンターの待機の仕事を終え、t2はドキュメントの印刷の仕事をしています。では、t1がジョブt2を中断しないようにするにはどうすればよいですか。これで、t2は印刷の仕事を終え、同じユーザーが別のドキュメントをスキャンしたいのですが、t1によってリリースされません。したがって、t1とt2の間のデッドロック、t1はプリンターを必要とし、t2はスキャナーを必要としますが、それらはすでに他のリソースを保持しています。

4

2 に答える 2

4

t1はスキャンとプリンターの待機の仕事を終え、t2はドキュメントの印刷の仕事をしています。では、t1がジョブt2を中断しないようにするにはどうすればよいですか。

このようなメカニズムを実装する良い方法は、キュー、たとえばスレッドセーフなBlockingQueueを使用し、 2つのコンシューマースレッドを用意することです。

  • printerQueueからジョブを取得するプリンタースレッド
  • ScannerQueueからジョブを取得するスキャナースレッド

次に、T0 ... T10は単にジョブをキューの1つに入れ、プリンター/スキャナーの準備ができたときにそれらが実行されるのを待つ(またはしない)だけです。

そうすることで、クライアント/プロデューサー側をロックする必要がなくなり、コンシューマー側(プリンターとスキャナー)にジョブを管理させることができます。

于 2013-01-18T09:00:15.207 に答える
3
  1. 1つのロックを使用する
  2. 複数のロックを決定した場合は、常に同じ順序でそれらを取得します(例では、常に最初にプリンターロックを取得し、次にスキャナーロックを取得します)
于 2013-01-18T08:55:11.923 に答える