none
CriticalSection 2 mal Unlock RRS feed

  • 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

    Donnerstag, 8. März 2012 13:50

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).aspx

    If 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
    Donnerstag, 8. März 2012 14:23
    Moderator

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).aspx

    If 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
    Donnerstag, 8. März 2012 14:23
    Moderator
  • 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

    Freitag, 9. März 2012 09:09
  • 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
    Montag, 12. März 2012 06:55
    Moderator
  • 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

     
    Dienstag, 20. März 2012 21:32