2011-12-30 15 views
0

私が並行して検索しようとしている特定の文字列に私が書いた並列コードがなぜミスアウトしているのか理解しようとしています。Thread.Foreach実行のミスヒットCが表示されない

ここにあります - 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メソッド内にロックを配置する必要がありますか? すべてのスレッドに単一のコレクションを使用しているので、TPLはロックを処理しますか、検索しようとしているコレクション自体のコピーを作成しますか?

ご協力いただきまして誠にありがとうございます。 ありがとう

+1

__Not Found__が印刷されている、または10行未満の出力行を取得していますか? –

+0

実際には、elseを置く前に出力が少なくなっています。つまり、出力が8または9であるので、elseを入れるべきだと思ったので、キーが見つからないことがわかりました。それはまだ奇妙です。私は非常にすべての鍵がそこにあると確信しています。 –

+0

次に、SearchCollectionメソッドの詳細が必要になります。スレッドセーフではない可能性があります。 –

答えて

1

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

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

これ以上解析するための詳細は提供していません。

+0

これは、その上に、またはメソッドの中にいくつかのロックを置く必要があることを意味しますか? –

+0

おそらく。 SearchCollection()は何をしますか、副作用はありますか?ハッシュの場合と同じです。 –

+0

さて、一度見つからない辞書のセットを検索すると、キーは変更され、検索のために次の辞書に渡されます。 –

関連する問題