私はスレッドのリストを持っている、と私は私のメインスレッドが終了するために、リスト内のすべてのスレッドを待つために取得しようとしている:リストアイテムの存在をアトミックにチェックし、リストアイテムのメソッドを呼び出す方法はありますか?
while (consumers.Count > 0) consumers[0].Join();
問題は、これがアトミックではありません、あり、そして私は "インデックスは範囲外"の例外を得ることができます。
コンシューマ[0]の存在を確認し、コンシューマ[0] .Join()を呼び出すためのアトミックな方法はありますか?
注:私は消費者で立ち往生参加しながら、()にアクセスする他のスレッドをブロックしたくないので、私は
lock (myLocker) { if (consumers.Count > 0) consumers[0].Join(); }
を行うことはできません。消費者を想定し
私のコピーはすぐに失効することを除いて。 スレッドが既に終了していると、thread.Join()が失敗するでしょうか? – mbeckish
他のすべてのコンシューマへのアクセスは同期されます。他のコードを見れば助けになるかどうか教えてください。 – mbeckish
@mbeckish:あなたのコピーはすぐに失効してしまいます。そして、Thread.Joinについてのあなたの直感は間違っています。「Joinが呼び出されたときにスレッドが既に終了していると、メソッドはすぐに戻ります。原子的に "スレッドの状態を確認して結合を呼び出す"ことができないとすれば、スレッドが既に終了している場合に例外をスローする結合APIは設計によって壊れてしまいます。 –