2つのスレッドを使って数値を数える小さなプログラムを作った。それはまた、カウントの隣に2番目の数字を表示するので、どのスレッドがどの番号を表示しているかを見ることができます。すぐにすべてのスレッドを殺す方法
私の目標は、それらのうちの1つが7とカウントされるとすぐに両方のスレッドを停止させることです。私はそれについてどうなるかわかりません。私はCounter
へのパラメータとしてスレッド配列を渡すことを考え、両方のスレッドを中止するためにforeachループを使用します。問題はt0
がそれを実行している可能性があり、t0.Abort()
を呼び出すため、t1.Abort()
はもう呼び出されないということです。
public static int count = 0;
private static object lockObject = new object();
static void Main(string[] args) {
Thread t0 = new Thread(() => Counter(1, 10));
Thread t1 = new Thread(() => Counter(10, 20));
t0.Start();
t1.Start();
t0.Join();
t1.Join();
Console.ReadLine();
}
public static void Counter(int k, int m) {
for(int i = k; i < m; i++) {
lock (lockObject) {
count++;
Console.WriteLine(count + " " + i);
if (i == 7) {
/*
* Code that will kill thread t0 and t1
*/
}
}
}
}
出力は
1 1
2 2
3 10
4 11
5 12
6 13
7 14
ような何か誰かがt0
とt1
の両方を殺すためにどのような提案を持っていなければなりませんか?
プレーンスレッドの代わりに 'タスク'を使用してもよろしいですか?もしそうなら、最初のスレッドがメインスレッドで終了するまで待つ簡単な方法があります。そして、それらをすべて終了することができます。 –
あなたの目標はどちらのスレッドも14以上の数字を印刷しないようにすることです。そして、カウントは決して減少しませんよね?なぜ、各スレッドがcount> 14を見たときに_itself_(すなわち、リターン)を殺すのではないのですか? –
'CancellationTokenSource'はあなたの友人です。 – code4life