Feedback

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

Veröffentlicht von am 9/9/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
==== 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!