2017-05-30 5 views
-3

Ich bin ein bisschen im Moment fragen. Ich las gerade ein wenig über Threads und landete dort: Task vs Thread Unterschiede [Duplizieren] hier auf stackoverflow von Jacek (Entschuldigung kann nicht einen Link erstellen, weil ich nur 2 mit Ruf <Gleichzeitig laufen Threads geben verschiedene Zahlen

und den ersten Kommentar von machen kann MoonKnight hat mich dorthin geführt: albahari.com/threading

Ich habe den Code genommen und ein wenig geändert, um es lesbarer zu machen was passiert. Hier kommt mein geänderten Code:

static void Main() 
    { 
     Thread t = new Thread(WriteY);   // Kick off a new thread 
     t.Start();        // running WriteY() 

     // Simultaneously, do something on the main thread. 
     for (int i = 0; i < 10; i++) { System.Threading.Thread.Sleep(1); Console.Write(i); }; 
     Console.ReadLine(); 
    } 

    static void WriteY() 
    { 
     for (int y = 0; y < 10; y++) { System.Threading.Thread.Sleep(1); Console.Write(y); }; 
     Console.ReadLine(); 
    } 

, was ich geschehen erwartet (und was die meiste Zeit geschieht) wurde dies: Gut Thema: enter image description here

aber hier ist die Sache, über die ich frage mich (seine absolut zufällig und versprach, den gleichen Code):

Wunder thread:

enter image description here

meine Fragen:

1.Wie kann das passieren, dass es verschiedene Zahlen gibt, die die Threads immer zur gleichen Zeit laufen sollten, sollten sie nicht?

2.all dies wird mehr verrückt desto geringer ist die Schlafzeit wird so, wenn Sie es vollständig entfernen Fell es absolut zufällig

+4

* "Die Threads sollten immer gleichzeitig laufen?" * - Nein. Stellen Sie sich vor, was erforderlich wäre, um sicherzustellen, dass die beiden Schleifen in den beiden Fäden bei jedem Schritt synchronisiert wurden. Es ist möglich, aber Sie müssten eine Menge Code schreiben, um das zu ermöglichen. Viele, viele Prozesse und Threads laufen auf Ihrem Computer. Sie bekommen jeweils ein bisschen Zeit, um ihr Ding zu machen. Threading ist unordentlich. Das Santa-Claus-Level-Wunder wäre, wenn zwei Threads, die mit identischem Code laufen, immer die gleichen Dinge tun, die dem Benutzer * zur gleichen Zeit erschienen. –

+0

Wenn Sie sie synchronisieren möchten, verwenden Sie einen geeigneten Mechanismus –

+0

@ed ich sehe Dank für die schnelle Antwort – Pr0gr4mm3r

Antwort

0

Wenn Sie die erste Schleife auf dem Haupt-Thread ausführen und WriteY() auf einem separaten Thread starten, gab ist absolut keine Möglichkeit, die Reihenfolge vorherzusagen, in der Ereignisse in einem Thread im Vergleich zu Ereignissen im anderen Thread auftreten.

Ich habe ein paar Tests geschrieben, um dies zu demonstrieren. Here's one. Und here's another.

Was diese beiden Beispiele charakterisiert, ist, dass sie oft in der "erwarteten" Reihenfolge laufen, aber nicht immer.

die uns ein paar Dinge über Multithreading-Operationen erzählt:

  • Concurrencty oder parallele Ausführung ist vorteilhaft, wenn wir Arbeit über Threads verteilen möchten, aber nicht, wenn Ereignisse in einer vorhersagbaren Reihenfolge auftreten müssen.
  • Es erfordert besondere Vorsicht, weil es, wenn wir es falsch machen, scheint, trotzdem zu funktionieren. Und dann wird es hin und wieder nicht funktionieren. Situationen, in denen es nicht funktioniert, sind extrem schwierig zu debuggen. Ein Grund dafür ist, dass Sie das Verhalten nicht wiederholen können, wenn Sie das möchten.
Verwandte Themen