Załóżmy, że istnieją dwa wątki, główny wątek i powiedzmy wątek B (stworzony przez główne). Jeśli B uzyskał muteks (powiedzmy pthread_mutex) i wywołał pthread_exit bez odblokowania blokady. Co się dzieje z muteksem? Czy to staje się darmowe?Co dzieje się z Mutexem, gdy wątek, który go nabył, opuszcza?
Odpowiedz
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.
- 1. co się dzieje, gdy wątek wyrzuca wyjątek?
- 2. Wątek zderzył się z zablokowanym Mutexem
- 3. Co dzieje się z wątkiem, który nie może uzyskać semafora?
- 4. Co dokładnie dzieje się, gdy funkcja Go zwraca wiele wartości
- 5. Co się dzieje, gdy moja() jest warunkowa?
- 6. Co dzieje się z innymi wątkami, gdy główny wątek wywołuje sys.exit()?
- 7. Co się dzieje, gdy dostawcy typu zmieniają się w F #?
- 8. Co dzieje się, gdy połączenia z MongoDB nie są zamknięte?
- 9. Java: co się dzieje, gdy nowy wątek jest uruchamiany ze zsynchronizowanego bloku?
- 10. Co dzieje się z zewnętrzną funkcją inline?
- 11. co się dzieje, gdy dwukrotnie importuję moduł w pythonie
- 12. Co stanie się, gdy wątek .NET zgłasza wyjątek?
- 13. Co dzieje się z wyłączoną obsługą przerwań?
- 14. Co się dzieje z LOST String obiektów
- 15. Co dzieje się w BeginProcessRequest()?
- 16. Co się tutaj dzieje z purecsami?
- 17. INotifyPropertyChanged: co dzieje się za sceną?
- 18. Co się dzieje, gdy wywołasz `if key in dyict`
- 19. Co dokładnie dzieje się po usunięciu zadania z ostatnich czasów?
- 20. Co dzieje się z AsyncTask, gdy aktywność uruchamiania jest zatrzymana/zniszczona, gdy nadal działa?
- 21. Co się dzieje, gdy pamięć podręczna varnish jest pełna?
- 22. Co się dzieje, gdy mongodb jest za mało pamięci?
- 23. Co dzieje się z tą tablicą bajtów?
- 24. Co dzieje się z zadaniem po anulowaniu?
- 25. Co tu dzieje się z zakresem JavaScript?
- 26. Co dzieje się z niezwiązanymi literałami JavaScript?
- 27. Co się dzieje w __libc_start_main?
- 28. Co się dzieje, gdy daję MyObject obj = new MyObject()
- 29. Co się dzieje, gdy wywoływana jest funkcja setState()?
- 30. Co się dzieje, gdy oczekujesz na już ukończone zadanie?
Merci Beaucoup !!! Wielkie dzięki !!! – Sadish
Kolejny wątek nie może go odblokować, chyba że jest to solidny muteks. –
Whoa, "mutex", który nie ma powinowactwa do wątku? Brak "porzuconego" statusu błędu? –