Benutzer mit den meisten Antworten
CriticalSection 2 mal Unlock

Frage
-
Hallo Leute,
Folgendes hat mich heute ein paar Stunden gekostet (siehe unten). Ein Prorgramm lief unter XP nicht mehr weil ich ein Unlock zuviel drin hatte. Jetzt bitt e keine Hinweise zu CSingleLock
etc. Was ich wissen möchte ist warum das unter Vista/Win7 etc. läuft aber unter XP nicht. Dort bleibt das Programm beim letzten Lock hängen, vermutlich weil durch 2 mal Unlock ein Counter -1 geworden ist (und nicht 0)
CCriticalSecion g_Section;
g_Section.Lock(); g_Section.Unlock(); g_Section.Unlock(); g_Section.Lock();
Gibt es Hinweise , Erklärungen?
Danke Freudi
Antworten
-
Folgendes hat mich heute ein paar Stunden gekostet (siehe unten). Ein Prorgramm lief unter XP nicht mehr weil ich ein Unlock zuviel drin hatte. Jetzt bitt e keine Hinweise zu CSingleLock
Warum? Gerade die Verwendung dieser Klasen machen die MT-Klassen erst sicher. Unlock/Lock direktzu verwenden ist gefährlich!
etc. Was ich wissen möchte ist warum das unter Vista/Win7 etc. läuft aber unter XP nicht. Dort bleibt das Programm beim letzten Lock hängen, vermutlich weil durch 2 mal Unlock ein Counter -1 geworden ist (und nicht 0)
CCriticalSecion g_Section;
g_Section.Lock(); g_Section.Unlock(); g_Section.Unlock(); g_Section.Lock();
Gibt es Hinweise , Erklärungen?Das Verhalten ist schlicht und einfach undefiniert!
Also was möchtest Du hier für eine Erklärung. Die OS verhalten sich undefiniert und das ist genau, dass was Du hier erlebst ;)
Und das ist auch genau was dokumentiert ist.Lies die Doku:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684169(v=vs.85).aspxIf a thread calls LeaveCriticalSection when it does not have ownership of the specified critical section object, an error occurs that may cause another thread using EnterCriticalSection to wait indefinitely.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Freudi Freitag, 9. März 2012 08:51
Alle Antworten
-
Folgendes hat mich heute ein paar Stunden gekostet (siehe unten). Ein Prorgramm lief unter XP nicht mehr weil ich ein Unlock zuviel drin hatte. Jetzt bitt e keine Hinweise zu CSingleLock
Warum? Gerade die Verwendung dieser Klasen machen die MT-Klassen erst sicher. Unlock/Lock direktzu verwenden ist gefährlich!
etc. Was ich wissen möchte ist warum das unter Vista/Win7 etc. läuft aber unter XP nicht. Dort bleibt das Programm beim letzten Lock hängen, vermutlich weil durch 2 mal Unlock ein Counter -1 geworden ist (und nicht 0)
CCriticalSecion g_Section;
g_Section.Lock(); g_Section.Unlock(); g_Section.Unlock(); g_Section.Lock();
Gibt es Hinweise , Erklärungen?Das Verhalten ist schlicht und einfach undefiniert!
Also was möchtest Du hier für eine Erklärung. Die OS verhalten sich undefiniert und das ist genau, dass was Du hier erlebst ;)
Und das ist auch genau was dokumentiert ist.Lies die Doku:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684169(v=vs.85).aspxIf a thread calls LeaveCriticalSection when it does not have ownership of the specified critical section object, an error occurs that may cause another thread using EnterCriticalSection to wait indefinitely.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort markiert Freudi Freitag, 9. März 2012 08:51
-
Danke Martin,
Und wenn ich 2 mal singleLock.Unlock(); merkt der das? Das probiere ich gleich mal :-)
Der mehrfache Unlock Aufruf war natürlich gaz klar nen Feler von mir, aber ehe ich den gefunden haben, weil es ja auf meiner Entwicklungsmachine nicht aufgetreten ist ... Ich habe mich da auch nen bisschen aufs Glatteis führe lassen von der Aussage das ich in ein und demselben Thread diesselbe Critcal Section durch aus mehrfach und verschachtelt verwenden kann. Die englische Erkärung besagt ja auch "another Thread ...wait...". Aber die Befehle erfolgen hintereinander im selben Thread.
Freudi
-
Hallo Freudi!
Und wenn ich 2 mal singleLock.Unlock(); merkt der das? Das probiere ich gleich mal :-)
Nach der Beschreibung "merkt" der gar nichts. Nur verhält sich die Criticalsection nicht mehr so wie sie es soll.
> Der mehrfache Unlock Aufruf war natürlich gaz klar nen Feler von mir, aber ehe ich den gefunden haben, weil es ja auf meiner Entwicklungsmachine nicht aufgetreten ist ... Ich habe mich da auch nen bisschen aufs Glatteis führe lassen von der Aussage das ich in ein und demselben Thread diesselbe Critcal Section durch aus mehrfach und verschachtelt verwenden kann. Die englische Erkärung besagt ja auch "another Thread ...wait...". Aber die Befehle erfolgen hintereinander im selben Thread.Aber Du kanst durchaus mehrfach die Cirtical Section locken in einem Thread!
Ich habe oft solche Konstrukte.
- Func1 Belegt die CS und macht was, gibt diese frei und kehrt zurück.
- Func2 Belegt die die CS und macht was, ruft dann Func1 auf (siehe da), macht noch was und gibt die CS frei und kehrt zurück.Wir haben genau in diesem Fall zwei Locks und zwei Unlocks aus einem Thread, die auch nötig sind.
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de -
Hallo Martin
Aber Du musst auch in ein und denselben Thread strikt darauf achten nicht ein Unlock zuviel zu machen. Zumindest mein XP beibt mit den 4 Zeilen
(g_Section.Lock(); g_Section.Unlock(); g_Section.Unlock(); g_Section.Lock();)
zuverlässig mit Deadlock stehen. Vista und Windows 7 stört es nicht. Da zwischen Lock und Unlock aber sowieso nicht zuviel passieren sollte ist das allerdings auch überschaubar,d .h ich erkenne schon ob das immer zusammen passt. In dem Sinne immer Augen auf im Programmierverkehr.
Freudi