Feedback

C# - Multithreading, Variable für 2 Threads, Lock Beispiel

Veröffentlicht von am 09.09.2008
(1 Bewertungen)
Hier wird eine Variable von zwei Threads benutzt und mittels lock für den jeweiligen Thread gesperrt, damit die Benutzung der Variable Threadsafe ist.

Der zweite Thread geht eine Liste von Zahlen durch und schreibt diese mit einer Scheife in eine Variable, diese Variable wird vom Mainthread verglichen und ggf. in der Console ausgegeben. Sobald sich current_process ändert, wird diese wieder in der Console ausgegeben.

Ich habe beide cs-dateien in den Code eingefügt, ihr könnt die Dateien jeweils kompilieren, es läuft ohne Änderung einwandfrei.

Hoffe das hilft Jemanden.

Gruß
Jim
GFU-Schulungen  [Anzeige]

C# 2017/2015/2013 Grundlagen

Nach Abschluss des Kurses sind Ihnen die Datentypen und Klassenbibliotheken von C# bekannt. Außerdem sind Sie in der Lage, mit Variablen umzugehen und deren Typen zu konvertieren. Sie definieren Namespaces und setzen diese ein, Sie erstellen eigene Klassen  und bauen Trouble Shooting ein.

ASP.NET Core und Angular Komplett für .NET-Entwickler

Sie  lernen in drei (3) Tagen wie man mit  ASP.NET Core und den Technologien  MVC, Entity Framework, WebAPI und  Razor professionelle sowie moderne  Web-Anwendungsarchitekturen aufbaut.  Die Schulung ist der perfekte  Einstieg um insbesondere datengetriebene  und präsentationsorientierte  Applikationen auf Basis der robusten und  skalierbaren ASP.NET Core  Plattform zu erstellen. Nach der Veranstaltung kennen Sie die Konzepte von Angular und können Angular in neue und bestehende ASP.NET-Anwendungen einsetzen.

==== Program.cs ====

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Threading;

namespace threads_syncen
{
    public class Program
    {

        [STAThread]
        public static void Main()
        {           

            Console.WriteLine("==================Threads==================");

            int puffer = 0;
            Class1 demo = new Class1();

            Thread auftrag_bearbeiten = new Thread(new ThreadStart(demo.auftrag));
            //auftrag_bearbeiten.Priority = ThreadPriority.AboveNormal;//so kann man auch bewirken das der Thread mehr CPUZeit bekommt und somit ruckzuck der Bool auf True gesetzt wird
            auftrag_bearbeiten.Start();

            //damit der gerade gestartete Thread auch die Zeit hat den Bool zu ändern
            Thread.Sleep(10);

            while (Class1.auftrag_laeuft == true)
            {
                lock (demo)//Object wird gesperrt, damit der Mainthread auf current_process sicher zugreifen kann
                {
                    if (puffer != Class1.current_process)
                    {
                        Console.WriteLine(Class1.current_process);
                        puffer = Class1.current_process;
                    }
                }
            }
            //damit sich die Console nicht sofort schließt
            Console.WriteLine("\n" + "Taste druecken um zu beenden");
            Console.ReadKey();

        }
    }
}



==== Class1.cs ====

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace threads_syncen
{
    
    public class Class1
    {
        //der Aktuelle Auftrag
        public static int current_process = 0;
        public static bool auftrag_laeuft = false;
        //Zahlen die durchgegangen werden und vom MainThread verglichen werden
        int[] nummern = new int[] {101,102,103,104,105,106,107,108,109,110,111,112,113};

        public void auftrag()
        {
            auftrag_laeuft = true;

            for (int i = 0; i < nummern.Length; i++)
            {
                
                current_process_setzen(nummern[i]);

                //do some Work
                Thread.Sleep(400);
            }
            auftrag_laeuft = false;

        }

        //Methode um current_process zu sperren fuer den Thread
        void current_process_setzen(int nummer)
        {
            lock (this)
            {
                current_process = nummer;
            }
        }

    }
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!