Benutzer-Werkzeuge

Webseiten-Werkzeuge


schule:nebenlaeufigkeit

Nebenläufigkeit

Wenn in einem Programm mehrere Dinge gleichzeitig ablaufen sollen, werden Threads verwendet. Einem Thread wird bei der Erzeugung der Name einer Methode im Konstruktor übergeben. Diese Methode wird beim Start des Threads ausgeführt. Das Programm wartet aber nicht, bis die Methode fertig ist, sondern läuft danach direkt weiter. Auf diese Weise können z.B. Berechnung im Hintergrund laufen, während die GUI der Anwendung weiterhin bedient werden kann. Die Berechnung und die GUI laufen in unterschiedlichen Threads.

Schauen wir uns nun den Quelltext an.

using System;
using System.Threading;
 
namespace ThreadDemo
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            new MainClass().start();
        }
 
        public void start()
        {
            // Erstelle zwei Threads. Als Argument wird der Name der
            // Methode übergeben, die beim Start ausgeführt werden soll.
            Thread threadX = new Thread(schreibeX);
            Thread threadO = new Thread(schreibeO);
 
            // Starte beide Threads. Die Methoden laufen danach
            // gleichtzeitig(!) ab.
            threadX.Start();
            threadO.Start();
        }
 
        void schreibeX()
        {
            for (int i = 0; i < 80; i++)
            {
                Console.Write("X");
            }
        }
        void schreibeO()
        {
            for (int i = 0; i < 80; i++)
            {
                Console.Write("O");
            }
        }
    }
 
}

Das Programm erzeugt bei mir folgende Ausgabe.

XXXOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Das ist zunächst ungewöhnlich. Sollte man doch vermuten, dass erst alle X und danach alle O ausgegeben werden. Aber der Computer wechselt die laufenden Threads nacheinander durch und gibt jedem Thread ein paar Millisekunden Zeit für die Ausführung. Danach wird der Thread pausiert und der nächste ist an der Reihe. So kommt mal threadX und damit die Methode schreibeX() und mal threadO und damit Methode schreibeO() dran.

Kapitel 15.2 in Visual C# 2012 erklärt weitere Details und Herr Rau hat in dem Artikel Threads I – Allgemeines und erstes Java im ersten Abschnitt eine gute Erklärung für Threads geliefert.

Im Spiel The Deadlock Empire muss man mehrere nebenläufige Prozesse so steuern, dass das Programm abstürzt. Dabei lernt man eine Menge über die vielen Fallstricke der nebenläufigen Programmierung.

  • Demonstrationsvideo Seriell vs. Parallel bzw. CPU vs. GPU
schule/nebenlaeufigkeit.txt · Zuletzt geändert: 2017-12-21 19:04 von marco.bakera