2010-12-12 6 views

Odpowiedz

14

nie. Muteks pozostaje zablokowany. Co właściwie dzieje się z takiego zamka zależy od jego rodzaju, można przeczytać o tym here lub here

+0

Merci Beaucoup !!! Wielkie dzięki !!! – Sadish

+0

Kolejny wątek nie może go odblokować, chyba że jest to solidny muteks. –

+0

Whoa, "mutex", który nie ma powinowactwa do wątku? Brak "porzuconego" statusu błędu? –

10

Jeśli stworzył solidną muteksu poprzez ustanowienie odpowiednich atrybutów przed wywołaniem pthread_mutex_init, mutex wejdzie specjalny stan, gdy wątek, który utrzymuje blokadę, kończy się, a następny wątek, który próbuje pobrać muteks, spowoduje błąd o wartości EOWNERDEAD. Jest on wtedy odpowiedzialny za wyczyszczenie dowolnego stanu, który mutex chroni i wywołuje, aby ponownie użyć mutex lub wywołać pthread_mutex_unlock (co spowoduje, że muteks będzie trwale niezdatny do użytku, dalsze próby jego użycia zwrócą ENOTRECOVERABLE).

Dla nieporęcznych muteksów, muteks jest trwale niezdatny do użytku, jeśli wątek, który je zablokował, kończy się bez jego odblokowania. Zgodnie z normą (zob. Rozdzielczość do issue 755 na trackerze Austin Group), muteks pozostaje zablokowany, a jego formalna własność nadal należy do wątku, który się zakończył, a każdy wątek, który próbuje go zablokować, zakleszczy się. Jeśli inny wątek próbuje go odblokować, jest to zwykle niezdefiniowane zachowanie, chyba że muteks został utworzony z atrybutem PTHREAD_MUTEX_ERRORCHECK, w którym to przypadku zostanie zwrócony błąd.

Z drugiej strony wiele (najbardziej?) Implementacji w świecie rzeczywistym nie spełnia wymagań normy. Próba zablokowania lub odblokowania muteksu z innego wątku może się nie powieść, ponieważ identyfikator wątku (używany do śledzenia własności) mógł zostać ponownie użyty i może teraz odnosić się do innego wątku (prawdopodobnie do tego, który tworzy nowe żądanie blokowania/odblokowania). Przynajmniej NPTL glibc jest znany z tego zachowania.

Powiązane problemy