2

N個のリソースのリストがあり、各リソースは一度に最大1つのスレッドで照会できます。

ほぼ同時に同じことを行う必要のあるスレッドがいくつかあります。各リソースに任意の順序でクエリを実行し(各スレッドには異なるクエリがあります)、応答を収集します。

各スレッドが0からN-1まで同じ順序でリソースをループする場合、それらはおそらく互いに待機する必要があり、これは効率的ではありません。

スレッドをランダムな順列でリソース上でループさせることを考えましたが、これは複雑すぎて効率的でもないようです。たとえば、2つのリソースと2つのスレッドの場合、半分の場合、同じ順序を選択してそれぞれを待機します。他の。

これを解決するための簡単で効率的な方法はありますか?

4

3 に答える 3

1

逆に考えた方がいいかもしれません。重要なのは、リソースの枯渇を防ぐことです。つまり、リソースがリクエストを処理していない時間を可能な限り最小限に抑えます。通常、ここではキューが役立ちます。

最大で 8 つの異なるリソースがあることを考えると、各リソースに独自のスレッドとキューを与えます。クエリを実行しているスレッドは、最初にすべての要求をこれらのキューに入れ、リソースがこのキューから消費されるまで待機します。このようにして、リソースはリクエストで飽和状態になり、飢餓が最小限に抑えられます。

于 2012-06-04T14:04:30.633 に答える
1

どういうわけか、これに対する私の答えは、ないということです。スレッドやスレッドがリソースにアクセスする順序を制御することはできません。また、何よりも (これが同期の全体的なポイントです)、スレッドの実行がどのようにスケジュールされるかわかりません。最後に作成されたスレッドが最初にスケジュールされる可能性があるため、空きリソースにアクセスさせようとしても、予測できない結果になる可能性があります。

私の頭に浮かぶ唯一のことは、パーティショニングです。つまり、アクセスするリソースやスレッドを部分的に分割します。これは単純な問題ではないことに注意してください。あなたが言ったように、スレッドとリソースが少ないと、スレッドがすでにロックされているリソースにアクセスしようとする可能性が高くなります。

于 2012-06-04T10:51:37.163 に答える
1

使用中のリソースをリストから削除するだけなので、各スレッドは次のことを行います。

  • リストからリソースを削除
  • 処理する
  • 元に戻す

明らかに、リストへのアクセスを同期する必要があります。このようにして、2 つのスレッドが同じリソースを使用しようとすることはありません。

于 2012-06-04T14:39:55.627 に答える