niedziela, 9 lutego 2014

Zakleszczenie, to taka sytuacja gdzie jeden wątek czeka na zakończenie się drugiego wątku, a ten drugi czeka na zakończenie się tego pierwszego. Jeden ze scenariuszy, który powoduje zakleszczenie to: POBIERZ PRZYKŁAD i przeanalizuj kod:

1: Główny wątek, wywołuje metodę RiseDeadlock, która wykona się w wątku pobocznym.

2: Kod w metodzie RiseDeadlock zakłada blokadę na obiekcie s_lockA, po czym wykonuje kolejne instrukcje. Jeśli instrukcje te wykonują się "długo", wówczas prawdopodobieństwo wystąpienie tego scenariusza jest "większe". Ważne aby te "długie" obliczenia nie zakończyły się przed obliczeniami opisanymi w punkcie trzecim.

3: Podczas wykonywania instrukcji opisanych w punkcie drugim, kod głównego wątku zakłada blokadę na obiekcie s_lockB, oraz wykonuje obliczenia aż do momentu, w którym pojawia się instrukcja założenia blokady na obiekcie s_lockA.


W tym momencie główny wątek, aby móc założyć blokadę na obiekcie s_lockA, czeka aż wątek poboczny zwolni blokadę na tym obiekcie.

4: Między czasie obliczenia, opisane w punkcie drugim (te "długie"), w wątku pobocznym wykonują się w całości. Wykonywanie kodu zatrzymuje się na linii, w której wątek poboczny zakłada blokadę na obiekcie s_lockB.

W tym momencie wątek poboczny, aby móc założyć blokadę na obiekcie s_lockB, czeka aż wątek główny zwolni blokadę na tym obiekcie.

Deadlock: lock (s_lockA) { lock (s_lockB) { } }

Categories: ,

0 komentarze :

Prześlij komentarz