2011-09-13 11 views
7

Czy są jakieś okoliczności, w których pole LockCount struktury RTL_CRITICAL_SECTION w systemie Windows może być zgodne z prawem?W jakich okolicznościach sekcja krytyczna systemu Windows może mieć ujemną liczbę blokad?

Śledzimy bardzo nieuchwytną awarię i jednym objawem, który widzimy jest CS z ujemnym LockCount. W chwili zderzenia liczba ta wynosi -6, ale wydaje się, że rutynowo wynosi -1, -2 itd.

Zanim zacznie się ścigać, przy założeniu, że jest to bardzo złe, ponieważ wystąpić, chcę tylko sprawdzić, czy to założenie jest poprawne. Nie mogę znaleźć prawie żadnych informacji o wewnętrznych działaniach RTL_CRITICAL_SECTION.

Odpowiedz

11

Ujemna liczba blokad to normalne zachowanie w niektórych wersjach systemu Windows. Zwróć uwagę, że znaczenie tego pola zmieniło się w czasie życia systemu Windows (patrz poniżej).

Interpretowanie tych prywatnych pól jest trudną sprawą i możesz skorzystać z narzędzi do krytycznego debugowania sekcji.

Na przykład, zobacz ten MSDN article podaje niektóre szczegóły. W szczególności myślę, że to pokazuje, dlaczego wartość -6 jest całkowicie wiarygodna.

Niektóre istotne fragmenty:

sekcje krytyczne mogą być wyświetlane w trybie użytkownika przez szereg różnych sposobów. Dokładne znaczenie każdego pola zależy od wersji systemu Microsoft Windows, której używasz.

......

W systemie Microsoft Windows 2000 i Windows XP, pole licznika blokad wskazuje, ile razy każdy Wątek nazwie rutynowe EnterCriticalSection tej sekcji krytycznej, minus jeden. To pole zaczyna się od -1 dla odblokowanej sekcji krytycznej. Każde wywołanie EnterCriticalSection zwiększa tę wartość; każde wywołanie metody LeaveCriticalSection zmniejsza ją. Na przykład, jeśli LockCount ma wartość 5, ta krytyczna sekcja jest zablokowana, jeden wątek ją zdobył, a pięć dodatkowych wątków czeka na tę blokadę.

......

W systemie Microsoft Windows Server 2003 z dodatkiem Service Pack 1 i nowsze wersje Windows, pole licznika blokad jest analizowany w następujący sposób:

  • Najniższy bit pokazuje status blokady . Jeśli ten bit ma wartość 0, krytyczna sekcja jest zablokowana; jeśli jest 1, sekcja krytyczna nie jest zablokowana.
  • Następny bit pokazuje, czy wątek został obudzony dla tej blokady. Jeśli ten bit ma wartość 0, to obudzono wątek dla tego zamka; jeśli jest to 1, , żaden wątek nie został przebudzony.
  • Pozostałe bity są jedynymi uzupełnieniami liczby wątków czekając na blokadę.

Następnie wyjaśnia, jak interpretować licznik blokady -22. Podsumowując, jest to trudniejsze, niż mogłoby się wydawać!

5

Od here jest częścią wyjaśnienie:

licznika blokad Jest to najważniejsza dziedzina w krytycznym punkcie. Został zainicjowany do wartości -1; wartość 0 lub większa oznacza , że sekcja krytyczna jest przechowywana lub posiadana. Gdy nie jest równe -1, , pole OwningThread (to pole jest niepoprawnie zdefiniowane w WINNT.H - powinno to być DWORD zamiast UCHWYTU) zawiera wątek ID, który jest właścicielem tej sekcji krytycznej. Różnica między tym polem a wartością (RecursionCount -1) wskazuje, ile dodatkowych wątków oczekuje na pozyskanie sekcji krytycznej.

+2

"Wartość 0 lub większa oznacza, że ​​sekcja krytyczna jest trzymana lub posiadana" mogła być prawdą raz, ale nie jest już prawdą w nowoczesnym systemie Windows. –

+0

Ta odpowiedź jest przestarzała i powinna zostać usunięta. –

Powiązane problemy