2011-01-05 20 views
19

Przesyłam średniej wielkości treść kodu C++ do Android NDK. Niestety implementacja pthreads (tak czy inaczej w NDK v5) jest niekompletna. W szczególności nasza aplikacja opiera się na pthread_cancel(), aby zabić wątek roboczy. NDK nie implementuje pthread_cancel()! Istnieją inne oczywiste odpowiedzi, gdy wątek roboczy reaguje normalnie. Ale w przypadkach, gdy wątek roboczy nie odpowiada (np. Nieskończona pętla), jak mogę anulować to bez zabicia całego procesu?pthread_cancel() alternatywy w Android NDK?

Odpowiedz

14

Możliwa opcja, która pracuje dla tego faceta: http://igourd.blogspot.com/2009/05/work-around-on-pthreadcancel-for.html

przeksięgowanie tutaj w przypadku:

Następnie używam pthread_kill wyzwolić sygnał SIG_USR1 i używać obsługi sygnału aby wyjść z tego Pthread i próbował go , to działa , ale nadal zastanawiasz się, czy nie ma żadnych wad tego rodzaju dla .

czasowy się:

if ((status = pthread_kill(pthread_id, SIGUSR1)) != 0) 
{ 
    printf("Error cancelling thread %d, error = %d (%s)", pthread_id, status, strerror status)); 
} 

USR1 obsługi:

struct sigaction actions; 
memset(&actions, 0, sizeof(actions)); 
sigemptyset(&actions.sa_mask); 
actions.sa_flags = 0; 
actions.sa_handler = thread_exit_handler; 
rc = sigaction(SIGUSR1,&actions,NULL); 
void thread_exit_handler(int sig) 
{ 
    printf("this signal is %d \n", sig); 
    pthread_exit(0); 
} 

Wygląda na to najlepszym rozwiązaniem jest przepisać tak, że wątki nie czekają na IO: http://groups.google.com/group/android-platform/browse_thread/thread/0aad393da2da65b1

+0

pracownik wątków czeka na semaforze dla zdarzeń zewnętrznych, kiedy czeka, więc to oczywiste miejsce, aby dodać czek na anulowanie nici. Istnieje kilka blokowanych operacji we/wy, ale nie jest to oczekiwana przyczyna braku odpowiedzi wątku. Miałem nadzieję, że nie będę używał sygnałów do wyłączania wątków, ponieważ wymaga to hackowania sigmasków w każdym wątku, IME. –

+2

Tak, to wstyd, że nie jest w bieżącym systemie Android NDK, dodaje kilka denerwujących zadań. Radości rozwoju wielu platform. Dość szybko przenieśliśmy naszą bibliotekę wątków, ponieważ nie musimy używać pthread_cancel lub semaforów, ale wygląda na to, że implementacja przeprogramowania/interfejsu będzie musiała ulec zmianie z powodu tego braku. –

+0

Wywołanie 'pthread_exit()' w procedurze obsługi sygnału jest w zasadzie tym, co robi anulowanie asynchroniczne (zobacz 'pthread_setcanceltype()'). Jest to niebezpieczne i trudne w użyciu. Odroczone anulowanie jest łatwiejsze w użyciu, ponieważ anuluje się tylko w określonych punktach anulowania (chociaż wciąż jest to znaczny wysiłek), ale jest trudniejsze do wdrożenia w bibliotece wątków. – jilles

0

I stworzyłem małą bibliotekę, która się tym zajmuje.

Wykorzystuje niektóre nieużywane bity struktury bionicznej nici.

zadzwoniłem to libbthread :)

Enjoy;)