2011-12-21 13 views
5

私のプログラムは、いくつかのタスクのためにいくつかのスレッドを作成します。ManagedThreadIDは一意ではありませんか?

私のコードは次のようである:

Dictionary<int, double> threadStates = new Dictionary<int, double>(); 
for (int i = 0; i < SubNNs.Count(); i++) 
{ 
    Thread tt = new Thread(StartTrainingSubs); 
    threadStates.Add(tt.ManagedThreadId, 0); 
    tt.Priority = ThreadPriority.Highest; 
    tt.Start(i); 
} 

しかしSubNNs.Count()は(10-20)大きくなると、時々、プログラムがこの例外をスロー:「同じキーを持つ項目が既に追加されています。」行番号threadStates.Add(tt.ManagedThreadId, 0);

なぜこのエラーが発生しますか? ManagedThreadIdは一意ではありませんか? 「はい」の場合、どうすればよいですか?

もしそうでなければ、スレッドが終了し、別のスレッドが同じManagedThreadIdで始まるかもしれませんか?出来ますか?どのようにこの問題を防ぐには?

他にも問題がありますか?

編集:ユーザーは、ManagedThreadIdを再利用できると述べています。したがって、コードの後半部分では、各スレッドが固有の番号で自分自身を知る必要があるため、スレッドに名前のようなものを追加して、すべてのスレッドがその固有の番号を取得できる方法はありますか?

ありがとうございました!

+3

はい、スレッドIDはリサイクルされます。 –

答えて

6

いいえ、スレッドが終了し、別のスレッドが同じManagedThreadIdで始まる可能性がありますか?出来ますか?どのようにこの問題を防ぐには?

はい。管理スレッドIDは再利用できます。彼らは辞書の状態キーのための良い選択ではありません。

スレッドIDを使用して状態を追跡する代わりに、他の独自の値を使用することを検討する必要があります。あなたのケースでは、 "私"はループごとにユニークです - なぜあなたのキーとしてそれを使用しないでください?

+0

ありがとうございます。 "私"はユニークです、そうです。コードの別の部分では、すべてのスレッドが自分自身を知る必要があり、すべてのスレッドはManagedThreadIdを認識しますが、 "i"は認識しません。 –

+0

すべてのスレッドに名前のようなものを設定できますか?したがって、すべてのスレッドはそれ自身を識別できますか? –

+1

@MahdiスレッドIDは何のために必要ですか?スレッドの開始に情報を渡すことができます - これは今では( 'tt.Start(i);')必要な状態を渡すだけです。一意の識別子が必要な場合は、ParameterizedThreadStartルーチンに一意の識別子を渡します。 –

関連する問題