Deadlocki w Windows: jak je wykryć i jak ich unikać

Gra zamarza na dwie sekundy w środku pojedynku. FPS pokazuje 240, a obraz stoi. Serwer gubi tick, mimo że procesor się nudzi. Za częścią takich przypadków stoi deadlock, czyli zakleszczenie wątków. Ten artykuł pokazuje, jak je rozpoznać i jak się ich pozbyć.
Co to jest deadlock
Deadlock od Valve… dużo o nim piszemy – niestety tym razem chodzi o coś mniej kolorowego – Deadlock systemowy, po polsku zakleszczenie, występuje wtedy, gdy dwa wątki czekają nawzajem na zasoby, które już sobie zablokowały. Wątek A trzyma blokadę 1 i czeka na blokadę 2. Wątek B trzyma blokadę 2 i czeka na blokadę 1. Żaden nie ustąpi, więc oba stoją do końca życia procesu.
Z perspektywy gracza nie widać żadnego obciążenia. Procesor ma zapas, karta graficzna ma zapas, a mimo to nic się nie rusza.
Gdzie to boli w grach i na serwerach
| Obszar | Przykład w grach | Konsekwencje |
|---|---|---|
| Klient | Blokada na wątku renderowania, gdy klatka czeka na dane z sieci | Zacięcie albo czarny ekran przy wysokim FPS |
| Serwer | Logika gry czeka na wynik z innego wątku, na przykład z AI | Opóźnienia w synchronizacji stanu, spadek tick-rate |
| Matchmaking | Algorytm dobierający graczy czeka na dane blokowane przez inny proces | Dłuższe kolejki, więcej timeoutów przy przydziale mapy |
BIOS, pamięć, sieć i input przechodzimy razem na Twoim ekranie. Pomiar przed i po robimy w Twoich grach, więc różnicę widzisz sam, zanim się rozłączymy.
Jak wykrywać deadlocki w Windows
- Menedżer zadań, zakładka Szczegóły. Kolumna Blocked pokazuje procesy zatrzymane przez blokadę.
- Process Explorer (Sysinternals). W
Open Handlesszukaj nazw mutexów, plików i obiektów COM trzymanych zbyt długo. - PerfMon. Liczniki
MutexWait TimeorazThreadTimeInState(4), czyli czas w stanie oczekiwania. - ETW i Debugging Tools. Włącz dostawcę Microsoft-Windows-Debugger i przejrzyj stosy w WinDbg poleceniem
~* k. Wątki zakleszczone stoją na tym samymWaitForSingleObjectprzez cały zrzut.
Skąd się biorą
- Różna kolejność zakładania blokad w różnych wątkach
- Operacja I/O wykonywana wewnątrz sekcji krytycznej
- Mieszanie apartamentów COM, czyli wywołania synchroniczne między STA i MTA
- Odwrócenie priorytetów, gdy wątek o niskim priorytecie trzyma blokadę potrzebną wątkowi o wysokim
Jak ich unikać
| Strategia | Co zrobić | Przykładowy kod (C++/Win32) |
|---|---|---|
| Lock ordering | Ustal jedną kolejność zakładania blokad i trzymaj się jej w całym kodzie, na przykład alfabetycznie po nazwie. | void AcquireAll(std::vector<MutexHandle>& locks){ std::sort(locks.begin(), locks.end(), [](auto& a, auto& b){ return a.name < b.name; }); for(auto& l : locks) WaitForSingleObject(l.handle, INFINITE); } |
| Try-lock z timeoutem | Jeśli nie zdobędziesz blokady w zadanym czasie, zwolnij to, co już trzymasz, i spróbuj od nowa. | bool TryLock(MutexHandle& m){ return WaitForSingleObject(m.handle, 500) == WAIT_OBJECT_0; } |
| Nie blokuj głównego wątku | Wątki UI i renderowania trzymaj wolne. I/O rób asynchronicznie. | // odczyt asynchroniczny przez strukturę overlapped ReadFile(hFile, buf, size, NULL, &ov); // żadnych blokujących wywołań w sekcji krytycznej |
| SRWLOCK zamiast mutexa | Wielu czytelników pracuje równolegle, a wyłączność dostaje tylko zapis. | std::shared_mutex srw; AcquireShared(srw); ReleaseShared(srw); |
| Higiena apartamentów COM | UI w STA, logika serwera w MTA. Unikaj synchronicznych wywołań między nimi. | CoInitializeEx(NULL, COINIT_MULTITHREADED); |
| Watchdog wykrywający cykle | Co kilka sekund sprawdzaj graf oczekiwań. Cykl oznacza zakleszczenie, więc zrestartuj wątek albo aplikację. | Przeszukiwanie w głąb (DFS) po grafie wait-for |
Konkretne przypadki z serwerów gier
| Problem | Rozwiązanie |
|---|---|
| Matchmaking czeka na bazę danych (SQL Server) | Skróć transakcje, przejrzyj plany zapytań, włącz READ COMMITTED SNAPSHOT. |
| Wątek AI trzyma mutex przez całe obliczenia | Przenieś obliczenia poza sekcję krytyczną i zwolnij blokadę zaraz po zapisie wyniku. |
| Synchronizacja stanu gry przy tick-rate 128 | Użyj SpinLock zamiast Mutex, ale trzymaj sekcję krytyczną w granicach kilku mikrosekund. |
Co z tego ma gracz
- Krótsze opóźnienia. Usunięcie zakleszczenia zdejmuje z czasu odpowiedzi serwera te milisekundy, których nie widać w żadnym benchmarku.
- Stabilna sesja. Klient przestaje zamarzać w losowych momentach, a wykres FPS przestaje mieć dziury.
- Lepsza skalowalność. Serwer obsłuży więcej graczy na tym samym sprzęcie.
Checklista po wdrożeniu zmian
- Menedżer zadań. Przy dużym obciążeniu żaden proces nie siedzi w stanie Blocked.
- PerfMon.
MutexWait Timeponiżej 5 ms dla aplikacji klienckich. - Serwer. Średni tick-rate co najmniej 128, bez gubionych ticków.
- Profiler. Intel VTune albo AMD uProf nie pokazuje długich sekcji krytycznych.
Podsumowanie
Zakleszczenie nie zużywa zasobów, więc nie zobaczysz go w żadnym wykresie obciążenia. Szukaj go tam, gdzie wątki stoją: w Menedżerze zadań, w Process Explorerze i w zrzutach stosu.
Trzy nawyki wystarczą, żeby ich nie produkować. Ustal jedną kolejność blokad. Trzymaj I/O poza sekcjami krytycznymi. Na serwerze sięgaj po struktury lock-free, a po stronie klienta po asynchroniczne I/O. Efekt widać w pingu, w stabilności klatek i w liczbie graczy, których serwer utrzyma bez zadławienia.
Powiązane artykuły
- Optymalizacja Windows do gier
- Valorant: za dużo FPS psuje tickrate klienta
- 10 najlepszych sposobów na poprawę FPS w grach 2026
- Oficjalna lista przydatnych narzędzi do gier
Klatki spadaja dokladnie wtedy, gdy zaczyna sie walka?
Deadlock mocno obciaza procesor w teamfightach i to wlasnie tam tracisz plynnosc, a razem z nia celnosc. Ustawiamy komputer zdalnie: Windows, sterowniki, BIOS i siec. Pomiar przed i po mozesz zrobic sam, w grze, przy nas. Nie blokujemy tego.
Zobacz optymalizacje PCGwarancja satysfakcji i szesc miesiecy wsparcia po sesji. Nie wiesz, czy warto? Popros o darmowe sprawdzenie na naszym Discordzie.Nasze darmowe narzędzia
Zbudowane in house. Bez konta, bez limitu.
Ultimate Demo AnalyzerWrzucasz demo z CS2, dostajesz rozpisane błędy i statystyki rundy.
Za darmo, bez konta
Deadlock Replay AnalyzerTo samo dla Deadlocka: analiza powtórki i plan na kolejne mecze.
Za darmo, bez konta
Konwerter czułościPrzenosisz cm/360 między grami bez gubienia pamięci mięśniowej.
Za darmo, bez konta
Trener celnościTrzydzieści sekund, trzy poziomy. Bez instalacji i bez konta.
Za darmo, bez konta





