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?
19
A
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
I stworzyłem małą bibliotekę, która się tym zajmuje.
Wykorzystuje niektóre nieużywane bity struktury bionicznej nici.
zadzwoniłem to libbthread :)
Enjoy;)
Powiązane problemy
- 1. Android NDK assert.h problems
- 2. Liczniki czasu Android NDK
- 3. budowanie android-ndk?
- 4. Android NDK C++ 'wstring' support
- 5. Android Wstępne instalowanie aplikacji NDK
- 6. Który kompilator używa Android NDK?
- 7. Android NDK z testem Google
- 8. Testy jednostkowe na Android NDK
- 9. Android NDK R8E brakuje stdlib.h
- 10. Debugowanie natywnych aplikacji Android NDK
- 11. Android NDK funkcja __android_log_print andLogCat
- 12. Kontrolowanie flag kompilatora w systemie Android NDK?
- 13. Włącz ICU w Android NDK Project
- 14. Wykorzystanie biblioteki C w ciągu Android NDK
- 15. Android NDK - używanie AssetManager w natywnym kodzie
- 16. Biblioteka Android NDK: findLibrary zwróciło null
- 17. java.lang.IllegalArgumentException: Nieprawidłowa nazwa klasy: ANDROID NDK javah
- 18. Android NDK R5 i wsparcie C++ wyjątek
- 19. Android NDK java.lang.UnsatisfiedLinkError: findLibrary zwrócił wartość null
- 20. Android NDK, Brak reguły, by celować
- 21. Android - Jak włączyć CheckJni dla rozwoju NDK?
- 22. Android NDK -multlib wsparcie przy użyciu gradle
- 23. ndk kompilacja i tworzenie plików .so android
- 24. Android NDK - Poradnik/biblioteki OpenGL ES
- 25. Gradle Budowanie systemu Android NDK wystawia
- 26. Android NDK i renderowania do żywych tapety
- 27. Android NDK: brak tablicy symboli archiwalnych
- 28. Problem z budową Android NDK project
- 29. Nie można znaleźć plików nagłówków - Android NDK
- 30. Łączenie STL do samodzielnego Android NDK wykonywalnego
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. –
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. –
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