私が書いた並列コードが、並列に検索しようとしている特定の文字列を見逃す理由を理解しようとしています。
これが私が持っているものです - 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 はロックを処理しますか?それとも、検索しようとしているコレクション自体のコピーを作成しますか?
どんな助けでも大歓迎です。ありがとう