Ich erstelle ein Beispiel über Thread,
Ich weiß, dass Verwendung Sperre Thread am kritischen Abschnitt Suspendierung vermeiden konnte, aber ich habe zwei Fragen.
1. Warum mein Programm stecken bleiben, wenn ich Thread.Sleep verwende?
In diesem Beispiel füge ich zwei Threads Schlaf hinzu.
Weil ich möchte, dass die Konsole langsamer ausgibt, damit ich leicht sehen kann, ob etwas falsch ist.
Aber wenn ich Thread.Sleep() verwende, dann wird dieses Programm stecken bleiben!Verwendung von Thread.Sleep in Sperrabschnitt C#
2.Welche Situation sollte ich Thread.Sleep verwenden?
Vielen Dank für Ihre freundliche Antwort, einen schönen Tag.
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);
}
}
}
}
Erklärung für Thread.Sleep (0): http://stackoverflow.com/questions/3257708/thread-sleep0-what-is- das-normal-verhalten –
aber stecken bleibt immer noch wenn ich Thread.Sleep (10/100/1000 ...) verwende – AHao
Dein Programm wird immer hängen bleiben. Wo es hängen bleibt, ist völlig zufällig, einer der Threads wird zuerst in die Sperre eintreten und der andere Thread wird niemals in die Sperre eintreten. Es ist etwas wahrscheinlicher, "Synchronisieren" ohne den Aufruf von Sleep() zu sehen, da der Jitter den Code schneller generieren kann. Aber natürlich ändern sich die count1 und count2 Werte nie. Verwenden Sie keine Threads, wenn dies noch nicht offensichtlich ist, sollten Sie das Thema viel gründlicher studieren. –