Benutzer mit den meisten Antworten
Anfängerfrage zu Mutex / Lock

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
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
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.- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. August 2012 16:47
-
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- Bearbeitet Marcel RomaModerator Mittwoch, 15. August 2012 13:48
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. August 2012 16:47
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
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.- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. August 2012 16:47
-
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- Bearbeitet Marcel RomaModerator Mittwoch, 15. August 2012 13:48
- Als Antwort markiert Robert BreitenhoferModerator Donnerstag, 30. August 2012 16: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,
RobertRobert 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.