2010-07-02 6 views
5

Jest scenariusz, mam dwa wątki, oba używają tego samego muteksu. Jeden wątek zablokował muteks i rozbił się. Jaki byłby stan mutex? Czy nadal jest zablokowany i druga nitka nigdy nie jest właścicielem tego muteksu? Oznacza sytuację impasu?Wątek zderzył się z zablokowanym Mutexem

Edit - także wyjaśnić przypadek Pthread na systemach Linux

+2

Proszę podać dodatkowe informacje. – InsertNickHere

Odpowiedz

3

Ponieważ nie określono co OS, powiem ci, co się dzieje w Win32.

W systemie Win32 drugi wątek otrzyma WAIT_ABANDONED, gdy przejdzie do oczekiwania na muteks należący do wątku, który został zakończony. Należy zauważyć, że odbiór WAIT_ABANDONED oznacza, że ​​drugi wątek otrzymał muteks, więc nie będzie zakleszczenia. Drugi wątek powinien wykryć wynik WAIT_ABANDONED i sprawdzić, czy zasoby chronione przez muteks są w poprawnym stanie. Jeśli wykryje uszkodzenie i nie wykryje żadnego, można bezpiecznie kontynuować. Jeśli nie, dobrym pomysłem jest zgłoszenie jakiegoś błędu.

W niektórych implementacjach muteksu nie ma możliwości wykrycia, że ​​wątek będący jego właścicielem zakończył się, a kończy się zakleszczeniem.

W przypadku niektórych implementacji muteksu istnieje sposób na wykrycie, co jest właścicielem wątku, wykrycie, że wątek będący właścicielem został zakończony, a następnie przejęcie na własność muteksu.

+1

w niektórych implementacjach można zdefiniować czas oczekiwania lub utworzyć własną metodę wrapper ... w każdym razie zawieszenie wątku nie ma wpływu na mutex \ semaphore w klasycznej implementacji, więc dobrze jest sprawdzić czas oczekiwania i podnieść limit czasu lub wznowić wykonywanie. – Oleksandr

+0

Przepraszamy za pół pytania. To jest w systemie operacyjnym Windows, a także chcesz znać inne zachowanie systemu operacyjnego. Gabe: Jeśli zawsze otrzymasz WAIT_ABANDONED, to łatwo będzie można z nim poradzić. Znów jest tam impas? Sposób wykrywania wątku właściciela jest zawieszany. Joonas Pulakka: Po prostu załóż wątek z NULL. Oznacza nie wyjątek lub nie ma potwierdzenia. – CrazyC

2

To z pewnością zależy na (przynajmniej) dwie rzeczy:

  • Jak mutex jest realizowany, a
  • Jak wywala wątek (to wyjątek, czy też po prostu „zniknąć”) .

Na przykład w synchronized bloków Javy są gwarantowane zostać zwolnione, gdy „gwint odbywa się z obiektem” - cokolwiek to znaczy (patrz link). Zgodnie z artykułem this:

Zatrzymanie wątku powoduje odblokowanie wszystkich zablokowanych monitorów.

Ok, stop() ing uwolnień przewlec monitory, ale co, jeśli nić tylko jakoś znika, jest on następnie „zrobić z obiektem”? Nie widzę tego udokumentowanego nigdzie. Ale jest oczywiste, że ktoś musi zwolnić zablokowane muteksy, w przeciwnym razie zablokują się; być może niektóre muteksy lub środowiska zawierają mechanizmy, które automatycznie wyzwalają muteksy, jeśli wątek, który je zablokował, przestaje istnieć.

Kolejny przykład: java.util.concurrent.Lock Dokumenty polecają za pomocą instrukcji finally zwolnić blokadę, aby cokolwiek stało się z wykonywanym wątkiem, zamek zostałby zwolniony. Jeśli jednak wątek zniknie, zanim instrukcja zostanie wykonana, blokada nigdy nie zostanie zwolniona i rzeczywiście wystąpi zakleszczenie. Oczywiście wątki nie powinny "znikać" tak po prostu.

Całkiem dobre pytanie!

+0

pytanie jest dobre, ale każda implementacja ma swój własny mechanizm i rozwiązanie, aby rozwiązać opisany problem, ale mogliśmy tylko zgadywać, co autor oznacza :) – Oleksandr

Powiązane problemy