2016-09-08 7 views
1

Ich habe eine Frage von Threads, die mich in letzter Zeit abgehört haben. Sehen Sie sich den folgenden C# -Code an.Multithreading-Konzepte

public void threading() 
{ 
    for(int count =0; count< 4; count++) 
    { 
     Thread childThread = new Thread(childThread); 
     childThread.start() 
    } 

    return; 
} 

public void childThread() 
{ 
// Do alot of work 
} 

Da es eine return-Anweisung direkt nach der Schleife innerhalb der threading Methode würde threading die return-Anweisung ausgeführt werden, bevor die alle Fäden Kind Ausführung beenden? Ich habe irgendwo gelesen, dass sich Threads von den Gabeln unterscheiden, da sie keinen separaten Speicherbereich erzeugen, also wo würde ein toter Thread landen?

+1

Mögliches Duplikat [C# Thread-Objekt Lebensdauer] (http://stackoverflow.com/questions/3699147/c-sharp-thread-object-lifetime) – zerkms

+0

„würde' threading' die return-Anweisung vor dem Ausführen Alle untergeordneten Threads beenden die Ausführung? " - Ja, da es in einem separaten Thread läuft. – Enigmativity

+0

Was meinst du mit "Sackgasse"? – Enigmativity

Antwort

2

würde threading die return-Anweisung ausführen, bevor alle untergeordneten threads ausgeführt werden?

Vielleicht ja. Vielleicht Nein. Alles hängt davon ab, wie lange Ihre childThread-Methode zur Ausführung benötigt. Falls Ihre childThread Methode wirklich weniger Zeit in Anspruch nimmt, kann es passieren, dass alle vier Threads enden, bevor die return-Anweisung in threading Methode ausgeführt wird.

Auf der anderen Seite, wenn es wirklich lange dauert, können Ihre Threads weiterhin asynchron ausgeführt werden, auch nachdem die Methode threading beendet wurde oder zu Main zurückgekehrt ist.

Eine weitere Sache müssen Sie wissen:

standardmäßig alle diese Fäden sie Hintergrund-Threads erstellen sind. Sie werden also existieren, solange Ihr Prozess am Leben ist. Wenn Ihr Haupt-GUI-Thread zu Ende geht, werden diese vier Threads auch für einen Wurf gehen und werden abgebrochen. Daher muss mindestens ein Vordergrund-Thread für Ihre vier Threads aktiv sein, damit die Ausführung der childThread-Methode fortgesetzt werden kann.

Soweit Speicher betroffen ist - Jeder Thread, der erstellt wird, hat einen eigenen Stapelspeicherbereich, aber sie teilen gemeinsamen Heap-Speicher. Auch wenn es sich um einen Stack-Speicher oder einen Heap-Speicher Ihres Threads handelt, liegt es sicher unter der Peripherie des eigenen Adressraums Ihres Prozesses.

0

Wenn Sie erzwingen möchten, dass alle untergeordneten Threads beendet werden, bevor Ihre Methode threading zurückgibt, können Sie die Methode Join für die Threads verwenden, z.

public void Threading() 
{ 
    List<Thread> threads = new List<Thread>(); 

    // start all threads 
    for(int count =0; count< 4; count++) 
    { 
     Thread childThread = new Thread(ChildThread); 
     childThread.start(); 
     threads.Add(thread); 
    } 

    // block until all threads have terminated 
    for(int count =0; count< 4; count++) 
    { 
     threads[count].Join(); 
    } 

    // won't return until all threads have terminated 
    return; 
} 

public void ChildThread() 
{ 
    // Do alot of work 
} 
+0

Großartig. Wie adressiert sie _ "würde threading die return-Anweisung ausführen, bevor alle untergeordneten threads ausgeführt werden?" _ Though? :) – MickyD

+0

Ich schätze, dass dies die Frage nicht beantwortet, wie es wörtlich gestellt wird. Eine andere Interpretation eines "Will X do Y?" Die Frage lautet: "Wie kann ich X zu Y machen?", worauf sich diese Frage bezieht ("Wie kann ich es so machen, dass die Methode erst zurückkehrt, nachdem alle untergeordneten Threads die Ausführung beendet haben?"). –