0

私が書いた並列コードが、並列に検索しようとしている特定の文字列を見逃す理由を理解しようとしています。

これが私が持っているものです - StringCollection は辞書です。キーはハッシュで、値は文字列です。検索する辞書は全部で 4 つあります。- InputStrings[] は文字列の配列で、正確には 10 個を検索する必要があります。

私のコードでは

Paralle.Foreach(InputStrings,currentString =>
{
  int key = some hashing function on currentString;
  if(SearchCollection(key))// boolean result
   {
     Console.WriteLine("Found:"+key);
   }
   else 
   {
    Console.WriteLine("Not Found:"+key);
  }
});

これを実行すると、8 つまたは 9 つのキーが見つかり、1 つまたは 2 つのキーが失われたままになります。検索しようとしているすべてのキーがコレクションに含まれていることはわかっています。検索されたキーは、特定の条件でさらに検索するために関数内で変更されます。つまり、キーが変更され、検索のためにサブディクショナリに渡されます。

したがって、私が提起するポイントは次のとおりです。

これは、スレッドが完了する前に終了していることを意味しますか? SearchCollection メソッドまたは SearchCollection メソッド内にロックを設定する必要がありますか? すべてのスレッドに 1 つのコレクションを使用しているため、TPL はロックを処理しますか?それとも、検索しようとしているコレクション自体のコピーを作成しますか?

どんな助けでも大歓迎です。ありがとう

4

1 に答える 1

1

および/またはハッシュSearchCollectionコードがスレッドセーフではないようです。

通常、複数のスレッドから読み取り専用のコレクションを使用することは安全ですが、実装によって異なります。

これをさらに分析するのに十分な詳細を提供していません。

于 2011-12-30T10:52:13.733 に答える