none
Anfängerfrage zu Mutex / Lock RRS feed

  • Frage

  • Hallo,

    im Zusammenhang mit der Erstellung einer Logdatei lokal und auf unserem Webserver taucht immer wieder der Begriff Mutex bzw Lock auf, damit verhindert wird, dass gleichzeitig mehrere Aktionen auf eine Datei ausgeführt werden.

    Ich habe z.B. lokal folgendes genutzt:

    Mutex m = new Mutex(false, "statistics mutex");      // globaler Mutex
    //Mutex m = new Mutex();                              // lokaler Mutex
    
    public void Statistics(object msg)
    {
    	try
    	{
    		m.WaitOne();
    		
    		CStatData cdata = (CStatData)msg;
    		if (!Directory.Exists(Path.Combine(cdata.Pfad.Trim(), "Stat")))
    			Directory.CreateDirectory(Path.Combine(cdata.Pfad.Trim(), "Statistic"));
    		FileStream fs = new FileStream(Path.Combine(cdata.Pfad.Trim(), "Statistic\\statistic.log"), FileMode.Append);
    		StreamWriter sw = new StreamWriter(fs);
    		sw.WriteLine(string.Format("{0};{1};{2};{3};{4}",
    			cdata.ctime.ToString(new CultureInfo("")),
    			cdata.cname,
    			cdata.Argument1,
    			cdata.Argument2,
    			cdata.Message));
    		sw.Flush();
    		sw.Close();
    		fs.Close();
    	}
    	catch (AbandonedMutexException ame)
    	{
    		if (ame.Mutex != null)
    			ame.Mutex.ReleaseMutex();
    	}
    	catch (IOException ex)
    	{
    
    	}
    	finally
    	{
    		m.ReleaseMutex();
    	}
    }

    Auf dem Webserver habe ich mit Lock gearbeitet:

    protected void DoWork(object state)
        {
            lock (_semaphore)
            {
                WriteStatistic();
            }
        }

    Beide Arten funktionieren - nur verstehe ich es nicht, wo der Unterschied liegt.

    Was passiert aber, wenn 2 Prozesse gleichzeitig auf das Schreiben in die Datei auf die Klasse zugreifen? Was passiert mit der 2. Info - geht die verloren oder gibt es dabei soetwas wie eine Warteschleife? Könnt ihr mir mal ein bisschen behilflich sein, dass ich es verstehe?

    Liebe Grüße

    Claudia

    Mittwoch, 15. August 2012 12:44

Antworten

  • Hallo Claudia Salzwedel,

    der Unterschied, zwischen Semaphore und Mutex besteht darin, dass wenn Mutex benutzt wird, kann nur einer Thread den kritischen Codeteil ausführen. Das heißt, dass nur ein Thread diesen Code ausführen darf und alle anderen warten müssen, bis dieses Mutexlock freigegeben wird. In Gegensatz dazu, kann man durch eine Semaphore der Zugang für einen bestimmten Codefragment sperren, wobei diese wie einen Zähler funktioniert. Die kann man einen Zahl zuweisen, was der Anzahl der gleichzeitig zugreifende Threads entspricht. Wenn dieser Zähler 0 ist, sind keine Threads mehr zugelassen. In den beiden Beispielen existiert eine Warteschlange, wo Threads, die Zugriff brauchen sich befinden. Wenn sich diese Sperrung aufhebt, darf der erster Thread in der Warteschlange den Code ausführen. Sie können sich weitere Beispiele, sowie die schon im C# exsistierende Mutex und Semaphore Klassen unter [1] und [2] anschauen.

    [1] http://msdn.microsoft.com/de-de/library/system.threading.mutex.aspx  
    [2] http://msdn.microsoft.com/de-de/library/system.threading.semaphore.aspx  

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Hristo Valev
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

    Mittwoch, 15. August 2012 13:37
  • Hallo Claudia,

    Ich empfehle dir dazu die Lektüre von Albaharis Threading in C#. Was Du hier anführst sind Thread/Prozess-Synchronisationstechniken, die u.a. dafür sorgen, dass sich in einem Codeblock zu einer gegebenen Zeit nicht mehrere Threads aufhalten können. Lock implementiert intern Monitor.Enter bzw. Monitor.Exit. Ein Mutex sorgt für exklusiven Zugriff auf ein Codeblock und ist viel langsamer als lock. Mit der evtl. notwendigen exklusiven Sperrung von Dateien haben diese Synchronisationstechniken jedoch nichts zu tun. Unabhängig wie dein Code auch synchronisiert, mußt Du die Dateien selbst sperren, wenn Du nicht willst, dass andere Prozesse schreibend darauf zugreifen. Das Vorhandensein eines Mutex bewirkt an sich gar nichts. Wenn Prozesse einen globalen Mutex verwenden, können sie den Zugriff auf gemeinsam verwendete Ressourcen synchronisieren. Wenn sie den Signalisierungsstatus des Mutex jedoch gar nicht überprüfen, oder gar nichts über dessen Existenz wissen, kann die Ressource auch nicht geschützt werden.

    Gruß
    Marcel


    Mittwoch, 15. August 2012 13:38
    Moderator

Alle Antworten

  • Hallo Claudia Salzwedel,

    der Unterschied, zwischen Semaphore und Mutex besteht darin, dass wenn Mutex benutzt wird, kann nur einer Thread den kritischen Codeteil ausführen. Das heißt, dass nur ein Thread diesen Code ausführen darf und alle anderen warten müssen, bis dieses Mutexlock freigegeben wird. In Gegensatz dazu, kann man durch eine Semaphore der Zugang für einen bestimmten Codefragment sperren, wobei diese wie einen Zähler funktioniert. Die kann man einen Zahl zuweisen, was der Anzahl der gleichzeitig zugreifende Threads entspricht. Wenn dieser Zähler 0 ist, sind keine Threads mehr zugelassen. In den beiden Beispielen existiert eine Warteschlange, wo Threads, die Zugriff brauchen sich befinden. Wenn sich diese Sperrung aufhebt, darf der erster Thread in der Warteschlange den Code ausführen. Sie können sich weitere Beispiele, sowie die schon im C# exsistierende Mutex und Semaphore Klassen unter [1] und [2] anschauen.

    [1] http://msdn.microsoft.com/de-de/library/system.threading.mutex.aspx  
    [2] http://msdn.microsoft.com/de-de/library/system.threading.semaphore.aspx  

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Hristo Valev
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu MarkenzeichenInformationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

    Mittwoch, 15. August 2012 13:37
  • Hallo Claudia,

    Ich empfehle dir dazu die Lektüre von Albaharis Threading in C#. Was Du hier anführst sind Thread/Prozess-Synchronisationstechniken, die u.a. dafür sorgen, dass sich in einem Codeblock zu einer gegebenen Zeit nicht mehrere Threads aufhalten können. Lock implementiert intern Monitor.Enter bzw. Monitor.Exit. Ein Mutex sorgt für exklusiven Zugriff auf ein Codeblock und ist viel langsamer als lock. Mit der evtl. notwendigen exklusiven Sperrung von Dateien haben diese Synchronisationstechniken jedoch nichts zu tun. Unabhängig wie dein Code auch synchronisiert, mußt Du die Dateien selbst sperren, wenn Du nicht willst, dass andere Prozesse schreibend darauf zugreifen. Das Vorhandensein eines Mutex bewirkt an sich gar nichts. Wenn Prozesse einen globalen Mutex verwenden, können sie den Zugriff auf gemeinsam verwendete Ressourcen synchronisieren. Wenn sie den Signalisierungsstatus des Mutex jedoch gar nicht überprüfen, oder gar nichts über dessen Existenz wissen, kann die Ressource auch nicht geschützt werden.

    Gruß
    Marcel


    Mittwoch, 15. August 2012 13:38
    Moderator
  • Hallo,

    danke für die ausführlichen Infos und Links. Das hat mir doch weitergeholfen. Leider hat man immer nur wenig Zeit, sich intensiv mit allem zu beschäftigen. Daher bin ich sehr froh, dass ich hier Hilfe finde.

    Liebe Grüße

    Claudia

    Mittwoch, 15. August 2012 15:47
  • Hallo Claudia Salzwedel,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 30. August 2012 16:48
    Moderator