2015-01-21 12 views
6

W systemie Linux z wieloma procesami system semaforów V pozwala na opcję SEM_UNDO zapobiegającą "utknięciu" semafora, jeśli proces zatrzymujący semafor się zawiesi. Jaka jest właściwa metoda zapobiegania zakleszczeniu się semaforów POSIX w wyniku awarii w procesie trzymającym semafor? Czy też POSIX gwarantuje, że semafor zostanie zwolniony w przypadku awarii?Równoważnik Sys V SEM_UNDO dla semaforów posix

+1

Czy to odpowiedział http://stackoverflow.com/questions/2053679/how-do-i-recover-a-semaphore-when-the-process-that-decremented-it-to-zero- crashe –

+0

Tak i nie. Miałem nadzieję na pewne wiarygodne źródło semaforów POSIX, pozostawiając rzeczy w nieokreślonym stanie w wyniku awarii. To łącze z pewnością oferuje sposób radzenia sobie z taką sytuacją, ale bez wyjaśnienia, dlaczego/jak wygląda nadzór ze specyfikacji POSIX. Właśnie użyłem semaforów SYS V na końcu, ale jestem ciekawy, dlaczego POSIX nie nakazuje czegoś, co wydaje się jedynym sensownym zachowaniem muteksa podczas awarii. – Joe

+1

Cóż: http://charette.no-ip.com:81/programming/2010-01-13_PosixSemaphores/ - również przy użyciu rozwiązania blokowania plików. –

Odpowiedz

-1

Możesz użyć programu obsługi sygnału dla SIGSEGV, a następnie odblokować i usunąć obsługę sygnału.

// set handler 
signal(SIGSEGV, handler); 

void handler(int signum) { 
// unlock the locked semaphores 
signal(SIGSEGV, SIG_DFL); 
} 
+0

Ale nie ma gwarancji, który wątek przechwytuje SEGV. Więc nie ma gwarancji, że będziesz w wątku, który jest właścicielem blokady. – Joe

+0

Domyślam się, że semafory nie mają pojęcia własności, muteksy robią. – Pointer