私はスレッドについての例を作成します
私は使用ロックがクリティカルセクションでのスレッドの中断を回避できると知っていますが、私は2つの質問があります。
1.私はThread.Sleepを使用すると私のプログラムが固まってしまいますか?
この例では、スリープを2つのスレッドに追加します。
私はコンソール出力がよりゆっくりとしたいので、間違っているかどうかを簡単に確認できます。
しかし、私がThread.Sleep()を使用すると、このプログラムが停止します!ロックセクションでthread.sleepを使用するC#
2.私はどのような状況でThread.Sleepを使用する必要がありますか?
よろしくお願いいたします。ありがとうございます。
class MyThreadExample
{
private static int count1 = 0;
private static int count2 = 0;
Thread t1;
Thread t2;
public MyThreadExample() {
t1 = new Thread(new ThreadStart(increment));
t2 = new Thread(new ThreadStart(checkequal));
}
public static void Main() {
MyThreadExample mt = new MyThreadExample();
mt.t1.Start();
mt.t2.Start();
}
void increment()
{
lock (this)
{
while (true)
{
count1++; count2++;
//Thread.Sleep(0); stuck when use Sleep!
}
}
}
void checkequal()
{
lock (this)
{
while (true)
{
if (count1 == count2)
Console.WriteLine("Synchronize");
else
Console.WriteLine("unSynchronize");
// Thread.Sleep(0);
}
}
}
}
のThread.sleepための解説(0):http://stackoverflow.com/questions/3257708/thread-sleep0-what-is-通常の動作 –
しかし、もし私がThread.Sleep(10/100/1000 ...)を使用してもまだまだ立ち往生します – AHao
あなたのプログラムは常に立ち往生するでしょう。スタックされた場所は完全にランダムですが、スレッドの1つが最初にロックに入り、もう1つのスレッドがロックに入ることはありません。ジッターがコードをより速く生成できるので、Sleep()呼び出しを使わずに「同期」することが多少ありそうです。もちろん、count1とcount2の値は決して変更されません。これがまだ明白でないときにスレッドを使用しないでください。もっと徹底的に勉強したいと思うでしょう。 –